gpt4 book ai didi

php - 极慢的 MySQL 查询

转载 作者:可可西里 更新时间:2023-11-01 08:07:09 24 4
gpt4 key购买 nike

我在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:除 ID 属性为 VARCHAR(9) 之外,所有属性均为 TINYTEXT。

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 来加速连接可能是个好主意。参见 this discussion .
  • LIKE 运算符通常很昂贵。考虑您的使用情况;就像 Marc 建议的那样,你应该索引 table1.attribute1。
  • 也许您可以通过完全省略 LIKE 来加快查询速度:例如,您可以使用 RIGHT() 而不是使用 'D%' ,虽然我不确定它是否会快得多。如果表中的数据不经常更改,则可以创建一个新的索引列,并预先切割 table1.attribute1 值的开头;然而,这取决于 PHP 脚本在 LIKE 之后插入的值。

关于php - 极慢的 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10263824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com