我在MySQL中有两个表,table1有1,013,347个实体和38个属性,table2有7,343,905个实体和10个属性。在下面的查询中(用于获取分页的行数),table1.ID是主键,table2.ID是外键(都有索引),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并具有默认配置)。非常感谢任何帮助。
编辑1:所有属性都是TINYTEXT,除了ID属性是VARCHAR(9)。
编辑2: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)
EXPLAIN SELECT ...
时,你会得到什么? - user212218'50'
,因为最终会让你出错。此外,还有指定的编码恐怖 "分页已死" 参考链接。 - Ben