我在 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 代码(通过 PHP 变量分配值“50”和“D”)和/或我的 MySQL 配置进行更改以加快速度(我正在使用具有默认配置的最新 XAMPP)。任何帮助将不胜感激。
EDIT1:所有属性都是 TINYTEXT,除了 ID 属性是 VARCHAR(9)。
EDIT2:解释选择...返回:
+----+-------------+--------+------+---------------+-------------+---------+------+---------+---------------------------------+
| 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)