我已经阅读了有关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定义表的行实际上不是捷径)。
从聊天讨论中添加:
贝克马克:
无索引= 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()使MySQL在20K行表和1-to-1上执行表扫描,JOIN
而不是在两个索引之间交叉500行。快了20倍。