mvo*_*sek 13 mysql index mysql-5.6
我已经阅读了有关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
Run Code Online (Sandbox Code Playgroud)
...但我总是必须查看定义了哪些索引或通过 Explain 确定将使用哪些索引。简单地写IGNORE INDEX ALL
而根本不在乎会非常方便。
有谁知道语法或黑客?(通过 MySQL 定义表的几十行确实不是捷径)。
基准:
无索引 = 148.5 秒
使用 index = 180 secs 并且仍在运行 Sending data 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;
Run Code Online (Sandbox Code Playgroud)
InnoDB,带有索引的测试(没有 USE INDEX() 或类似的)仍在运行,250 秒,我刚刚杀死了它。
ype*_*eᵀᴹ 26
绝对不清楚您为什么要这样做USE INDEX ()
,但您可以使用提示告诉优化器不要使用任何索引。来自 MySQL 文档:索引提示
省略
index_list
forUSE INDEX
在语法上是有效的,这意味着“不使用索引”。为FORCE INDEX
or省略 index_listIGNORE INDEX
是语法错误。
您的查询变为:
SELECT count(*) AS c,
substring_index(domain_name, '.', -1) AS tld
FROM domains_import
USE INDEX () -- use no indexes
GROUP BY tld
ORDER BY c DESC
LIMIT 100 ;
Run Code Online (Sandbox Code Playgroud)
旁注:复杂的表达式:
SUBSTRING(domain_name, LENGTH(domain_name) - LOCATE('.', REVERSE(domain_name)) + 2)
Run Code Online (Sandbox Code Playgroud)
可以从 4 个函数调用简化为 1 个:
SUBSTRING_INDEX(domain_name, '.', -1)
Run Code Online (Sandbox Code Playgroud)