[英]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)
很少有提高績效的想法
而不是在SQL(100/18)內進行計算,而是像這樣替換它
HAVING(COUNT(table2.ID)*(5.5555))> = 50
(因為table2.ID現在是一個bigint,數學比較必須稍快一些)
就像我看到的那樣,like子句在這個查詢中是至關重要的,即使它很昂貴,如果你索引table1.attribute1也會更好。
希望這可以幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.