2017-12-11 13 views
0

をスピードアップする必要がありますインデックスは、私は次の詳細を持つテーブルがある

CREATE TABLE `test` (
    `seenDate` datetime NOT NULL DEFAULT '0001-01-01 00:00:00', 
    `corrected_test` varchar(45) DEFAULT NULL, 
    `corrected_timestamp` timestamp NULL DEFAULT NULL, 
    `unable_to_correct` tinyint(1) DEFAULT '0', 
    `fk_zone_for_correction` int(11) DEFAULT NULL, 
    PRIMARY KEY (`sightinguid`), 
    KEY `corrected_test` (`corrected_test`), 
    KEY `idx_seenDate` (`seenDate`), 
    KEY `idx_corrected_test_seenDate` (`corrected_test`,`seenDate`), 
    KEY `zone_for_correction_fk_idx` (`fk_zone_for_correction`), 
    KEY `idx_corrected_test_zone` (`fk_zone_for_correction`,`corrected_test`,`seenDate`), 
    CONSTRAINT `zone_for_correction_fk` FOREIGN KEY (`fk_zone_for_correction`) REFERENCES `zone_test` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

私は、次のクエリを使用しています:ここで

SELECT 
    * 
FROM 
    test 
WHERE 
    fk_zone_for_correction = 1 
     AND (unable_to_correct = 0 
     OR unable_to_correct IS NULL) 
     AND (corrected_test = '' 
     OR corrected_test IS NULL) 
     AND (last_accessed_timestamp IS NULL 
     OR last_accessed_timestamp < (NOW() - INTERVAL 30 MINUTE)) 
     ORDER BY seenDate ASC 
LIMIT 1 

は、オプティマイザのスクリーンショットです - ORDER BY物事が減速していると私の意見では、適切にインデックスが作成されているようで、正しいインデックス(idx_corrected_test_zone)が選択されています。それを改善するために何ができるのですか?

enter image description here

+0

でくださいないクロスポスト:https://dba.stackexchange.com/questions/192833/speed-up-query-when-seemingly-correct-indexを-is-being-used –

+0

'EXPLAIN'のテキスト版を表示してください。 –

答えて

0

ずっと役立つ何INDEXはありません。

このかもしれないヘルプ:

INDEX(fk_zone_for_correction, seenDate) 

両方のカラムは、おそらく使用することができます - 並べ替えすることを回避する第二、フィルタリングのための最初の。しかし、それがすぐに1行を見つけることができない場合、それは逆行する可能性があります。

キラーはORです。あなたはNULLとそれらの3つの列のいずれかを取り込む避けることができれば、これは良いかもしれない:

INDEX(fk_zone_for_correction, unable_to_correct, corrected_test, last_accessed_timestamp) 
-- the range thing needs to be last 
-- this index would do the filtering, but fail to help with `ORDER` and `LIMIT`. 

を、それがidx_corrected_test_zoneを使用しているにもかかわらず、それはおそらく、最初の2列以上のものを使用していない - なぜならORの。

冗長インデックスの2つのケースがあります。たとえば、これらのうちの最初のものはで、残りの部分はです。その第一は、冗長であり、DROPpedことができます。

KEY `corrected_test`    (`corrected_test`), 
KEY `idx_corrected_test_seenDate` (`corrected_test`,`seenDate`), 
関連する問題