【问题标题】:Mysql ENUM doesn't use indexMysql ENUM 不使用索引
【发布时间】:2013-01-23 11:36:32
【问题描述】:

我在 MySQL 中遇到了枚举字段的问题。当我只使用一个值 SELECT * FROM test WHERE t IN ('new') 时,一切都很好,但是如果有多个值 SELECT * FROM test WHERE t IN ('new','deleted') MySQL 没有完全使用索引,因此此查询的性能非常低。有没有可能用它做点什么?

CREATE TABLE `test` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`t` ENUM('new','active','deleted') NOT NULL,
PRIMARY KEY (`id`),
INDEX `t` (`t`)
)
ENGINE=MyISAM;


INSERT INTO test SET t = 'new';
INSERT INTO test SET t = 'new';
INSERT INTO test SET t = 'active';
INSERT INTO test SET t = 'active';
INSERT INTO test SET t = 'deleted';
INSERT INTO test SET t = 'deleted';


EXPLAIN SELECT * FROM test WHERE t IN ('new');
id|select_type|table|type|possible_keys|key|key_len|ref  |rows|Extra
1 |SIMPLE     |test |ref |t            |t  |1      |const|2   |Using index condition

EXPLAIN SELECT * FROM test WHERE t IN ('new','deleted');
id|select_type|table|type|possible_keys|key |key_len|ref |rows|Extra
1 |SIMPLE     |test |ALL |t            |NULL|NULL   |NULL|6    |Using where

【问题讨论】:

    标签: mysql enums indexing


    【解决方案1】:

    MySQL 没有在第二种情况下使用索引这一事实并不意味着性能会很差(尽管可能会如此)。索引的差异不是很大,因此查询优化器认为不是扫描索引两次(每个值一次)然后读取每个选定索引的行,扫描表和直接挑出行。

    这样的索引如果要有用,通常需要大量的 TLC(Tender Loving Care)。查看here 了解更多信息。

    【讨论】:

    • TLC 是什么意思?我能找到的只是“事务、锁定和并发”,但这在这种情况下似乎没有意义。
    • @MarkAmery,温柔的关怀。该索引的差异化很差,因此可能需要不时进行重新平衡(主键会自行处理)。
    猜你喜欢
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 2013-04-07
    • 2013-07-10
    相关资源
    最近更新 更多