繁体   English   中英

MySQL查询速度极慢

[英]Extremely slow MySQL query

我在MySQL中有两个表,table1有1,013,347个实体和38个属性,table2有7,343,905个实体和10个属性。 在以下查询中(应该获取分页的行数),table1.ID是PK,table2.ID是它的FK(两者都被索引),如果HAVING子句超过一定百分比,则获取值,在这种情况下50%

SELECT SQL_CALC_FOUND_ROWS * 
FROM table1 INNER JOIN table2 ON table1.ID = table2.ID 
WHERE table1.attribute1 LIKE 'D%' 
GROUP BY table2.ID 
HAVING (COUNT(table2.ID) * (100/18)) >= '50'

即使在我发布的简化状态下,此查询也可以通过命令行运行不少于5分钟。 我知道我必须对查询进行更改,PHP代码(值'50'和'D'通过PHP变量分配)和/或我的MySQL配置以加快速度(我正在使用最新的XAMPP,默认配置)。 任何帮助将不胜感激。

EDIT1:所有属性都是TINYTEXT,但ID属性是VARCHAR(9)。

EDIT2:EXPLAIN SELECT ...返回:

+----+-------------+--------+------+---------------+-------------+---------+------+---------+---------------------------------+
| id | select_type | table  | type | possible_keys | key         | key_len | ref  | rows    | Extra                           |
+----+-------------+--------+------+---------------+-------------+---------+------+---------+---------------------------------+
|  1 | SIMPLE      | table2 | ALL  | NULL          | NULL        | NULL    | NULL | 7343905 | Using temporary; Using filesort |
|  1 | SIMPLE      | table1 | ref  | ID            | ID          | 29      | func |       1 | Using where                     |
+----+-------------+--------+------+---------------+-------------+---------+------+---------+---------------------------------+
2 rows in set (0.00 sec)

以下是一些潜在的改进:

  • 您正在使用类型为VARCHAR(9)的ID,并且您正在使用这些字段进行连接。 引入整数代理键而不是varchars来加速连接可能是个好主意。 这个讨论
  • LIKE运营商通常很贵。 考虑你的用法; 像Marc建议的那样,你应该索引table1.attribute1。
  • 也许你可以通过省略LIKE来加速查询:例如,你可以使用RIGHT() ,而不是使用'D%',虽然我不确定它是否会更快。 如果表中的数据不经常更改,则可以创建一个新的索引列,其中预先切割table1.attribute1值; 然而,它依赖于php脚本在LIKE之后插入的值。

很少有提高绩效的想法

  1. 索引table2.ID(必须)和table1.ID也是如此
  2. 如果可能的话,使id列bigint和table1.attribute1成为varchar。 请注意根据列的假定数据长度为varchar列定义合适的大小
  3. 而不是在SQL(100/18)内进行计算,而是像这样替换它

    HAVING(COUNT(table2.ID)*(5.5555))> = 50

(因为table2.ID现在是一个bigint,数学比较必须稍快一些)

就像我看到的那样,like子句在这个查询中是至关重要的,即使它很昂贵,如果你索引table1.attribute1也会更好。

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM