FORCE
インデックスに関する記事を読みましたが、MySQLを強制的にIGNORE ALL
インデックス化するにはどうすればよいですか?
試しましたがSELECT * FROM tbl IGNORE INDEX(*)
、うまくいきませんでした。
なぜ私(および他の人)がこれを行う必要があるのかについては、たとえば、次のようにtldでリファラー統計を要約する必要がありました。
SELECT
count(*) as c,
SUBSTRING
(
domain_name,
LENGTH(domain_name) - LOCATE('.', REVERSE(domain_name)) + 2
) as tld
FROM `domains_import`
IGNORE INDEX(domain_name)
GROUP BY tld
ORDER BY c desc
LIMIT 100
...しかし、私は常に定義されているインデックスを確認するか、Explainを使用してどのインデックスを使用するかを決定する必要があります。単に書いてIGNORE INDEX ALL
、気にしないのは非常に便利です。
誰かが構文やハックを知っていますか?(MySQL定義テーブルを介した数十行は、実際にはショートカットではありません)。
チャットディスカッションから追加:
Bechmark:
インデックスなし= 148.5秒
インデックス= 180秒で、まだデータの送信で実行中SSDアレイは非常に強力であるため、データキャッシュはほとんど気にしません...
ベンチマークの定義:
CREATE TABLE IF NOT EXISTS `domains_import` (
`domain_id` bigint(20) unsigned NOT NULL,
`domain_name` varchar(253) CHARACTER SET ascii COLLATE ascii_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `domains_import`
ADD PRIMARY KEY (`domain_id`),
ADD UNIQUE KEY `domain_name` (`domain_name`);
ALTER TABLE `domains_import`
MODIFY `domain_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT;
InnoDB、インデックス(USE INDEX()または類似のものなし)を使用したテストが250秒間実行されていますが、それを強制終了しました。
LEFT JOIN
た。`USE INDEX()`により、MySQLJOIN
は2つのインデックス間で500行をクロスする代わりに、20K行のテーブルと1対1のテーブルスキャンを実行しました。20倍速くなりました。