這可能是以前被問過的,但是我還沒有找到具有特定問題的線程。所以我有一個索引很大的表格,裏面有超過2500萬行,速度非常重要。我一直在努力盡可能優化結果,但有些奇怪的事情仍在繼續。MySQL中嚴重索引的表,但錯誤的索引正在使用導致執行時間很長
我有這個表:
當在只有一列做查詢的WHERE子句,它的作品,因爲它應該,但是,當我做 EXPLAIN EXTENDED SELECT * FROM externallinks_global FORCE INDEX (APIINDEX1,APIINDEX2,APIINDEX3,APIINDEX4,APIINDEX5,APIINDEX6,APIINDEX7,APIINDEX8) LEFT JOIN externallinks_paywall ON externallinks_global.paywall_id=externallinks_paywall.paywall_id WHERE (
live_state IN (0, 7) OR externallinks_global.paywall_id IN (SELECT paywall_id FROM externallinks_paywall WHERE
paywall_status IN (3))) AND
審查= 0 LIMIT 100000,1001;
出於某種原因,它試圖使用REVIEWED索引而不是APIINDEX5。我試圖強制它使用它,但它決定不使用索引。我有點迷路。我顯然做錯了什麼,但我不知道是什麼。
下面是從上述查詢的解釋:
+------+--------------+-----------------------+--------+---------------------------------------------------+---------------+---------+--------------------------------------------------+----------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+------+--------------+-----------------------+--------+---------------------------------------------------+---------------+---------+--------------------------------------------------+----------+----------+-------------+
| 1 | PRIMARY | externallinks_global | ALL | APIINDEX3,APIINDEX4,APIINDEX6,APIINDEX2,APIINDEX5 | NULL | NULL | NULL | 27193330 | 100.00 | Using where |
| 1 | PRIMARY | externallinks_paywall | eq_ref | PRIMARY | PRIMARY | 4 | s51059__cyberbot.externallinks_global.paywall_id | 1 | 100.00 | |
| 2 | MATERIALIZED | externallinks_paywall | ref | PRIMARY,PAYWALLSTATUS | PAYWALLSTATUS | 1 | const | 768 | 100.00 | Using index |
+------+--------------+-----------------------+--------+---------------------------------------------------+---------------+---------+--------------------------------------------------+----------+----------+-------------+
3 rows in set, 1 warning (0.00 sec)
感謝您的及時迴應。我會試一試並報告。 – Cyberpower678
感謝您的幫助。按照你的解釋工作。 – Cyberpower678