如何强制 MySQL 忽略所有索引?

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_listforUSE INDEX在语法上是有效,这意味着“不使用索引”。FORCE INDEXor省略 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)