mysql - 如何使用 case 语句优化 select 查询?

标签 mysql sql indexing query-optimization

我有 3 个表超过 1,000,000 条记录。我的选择查询运行了几个小时。 如何优化呢?我是新手。

我尝试为 name 添加索引,但加载仍需要数小时。

像这样,

ALTER TABLE table2 ADD INDEX(name);

也像这样,

CREATE INDEX INDEX1 table2(name);

SELECT MS.*, P.Counts FROM 
(SELECT M.*, 
TIMESTAMPDIFF(YEAR, M.date, CURDATE()) AS age,               
CASE V.name 
WHEN 'text' THEN  M.name 
WHEN V.name IS NULL THEN M.name 
ELSE V.name 
END col1  
FROM table1 M 
LEFT JOIN table2 V ON M.id=V.id) AS MS
LEFT JOIN 
(select E.id, count(E.id) Counts 
from table3 E
where E.field2 = 'value1' 
group by E.id) AS P
ON MS.id=P.id;

Explain <above query>; 

输出:

+----+-------------+------------+------------+-------+---------------------------------------------+------------------+---------+------------------------+---------+----------+-----------------------------------------------------------------+
| id | select_type | table      | partitions | type  | possible_keys                               | key              | key_len | ref                    | rows    | filtered | Extra                                                           |
+----+-------------+------------+------------+-------+---------------------------------------------+------------------+---------+------------------------+---------+----------+-----------------------------------------------------------------+
|  1 | PRIMARY     | M          | NULL       | ALL   | NULL                                        | NULL             | NULL    | NULL                   |  344763 |   100.00 | NULL                                                            |
|  1 | PRIMARY     | <derived3> | NULL       | ref   | <auto_key0>                                 | <auto_key0>      | 8       | CP.M.id |      10 |   100.00 | NULL                                                            |
|  1 | PRIMARY     | V          | NULL       | index | NULL                                        | INDEX1           | 411     | NULL                   | 1411083 |   100.00 | Using where; Using index; Using join buffer (Block Nested Loop) |
|  3 | DERIVED     | E          | NULL       | ref   | PRIMARY,f2,f3                 | f2| 43      | const                  |  966442 |   100.00 | Using index                                                     |
+----+-------------+------------+------------+-------+---------------------------------------------+------------------+---------+------------------------+---------+----------+-----------------------------------------------------------------+

我希望在 1 分钟内得到结果。

为清楚起见缩进了查询。

SELECT MS.*, P.Counts
  FROM  (
           SELECT M.*, 
                  TIMESTAMPDIFF(YEAR, M.date, CURDATE()) AS age,               
             CASE V.name 
                  WHEN 'text' THEN  M.name 
                  WHEN V.name IS NULL THEN M.name 
                  ELSE V.name 
                  END col1  
             FROM table1 M 
             LEFT JOIN table2 V ON M.id=V.id
      ) AS MS
  LEFT JOIN ( 
                  select E.id, count(E.id) Counts 
                   from table3 E
                   where E.field2 = 'value1' 
                   group by E.id
    ) AS P ON MS.id=P.id;

最佳答案

您的查询没有过滤谓词,因此它实际上是在检索所有行。那是来自 table1 的 1,000,000 多行。然后它与 table2 连接,然后与另一个表表达式/派生表连接。

为什么您希望此查询很快?像这样的大规模查询通常会在晚上以批处理的形式运行。我假设此查询不是针对在线流程的,对吧?

也许您需要重新考虑这个过程。您真的需要以交互方式一次处理数百万行吗?用户会在网页中阅读一百万行吗?

关于mysql - 如何使用 case 语句优化 select 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56692243/

相关文章:

php - MySQL 将包含 200 万条记录的查询写入新表

mysql - 我可以使用 GUI 工具通过 SSH 连接到 MySQL 吗?

sql - 按聚合 (ARRAY_AGG) 聚合?

Mysql 5.1 在连接选择结果时不使用索引

php - 文件上传 php $_FILES 未定义索引错误

php - Excel 导出 CSV 导入 PHPmyAdmin

mysql - 在一个 mysql 查询中从多个表中选择数据

sql - 多列索引效率

mysql - 无限制地从表中选择第二大的

python - 在元组列表中查找索引