MySQL/MariaDB 上的简单键值存储是否需要键索引?

mpe*_*rin 3 mysql mariadb index

我正在与另一位开发人员就简单键/值表上的 SELECT 查询的性能进行交流。

CREATE TABLE cache (
            id BIGINT unsigned not null auto_increment,
            name VARCHAR(32),
            uri VARCHAR(255),
            value LONGTEXT,
            expire DATETIME,
            PRIMARY KEY (id)
        ) DEFAULT CHARSET=utf8";
Run Code Online (Sandbox Code Playgroud)

默认情况下,该表没有索引,一旦缓存增大,我就会遇到简单 SELECT 查询的性能非常差的情况:

SELECT value
FROM cache
WHERE name = '$cache_name' AND expire >= '$now'
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

我在名称上添加了索引,它解决了我的性能问题。

然而,原始代码的作者告诉我,名称字段中存储的数据基数非常低,因为没有重复值(我们存储哈希值),因此不需要索引,更糟糕的是,它可能会导致性能问题。

是真的吗?为什么我的经历恰恰相反?MySQL 和 MariaDB 的行为有可能不同吗?

Rol*_*DBA 5

如果没有索引,每次都会进行全表扫描。很高兴您为表格建立了索引。

我建议您创建一个复合索引,以便随着表的增长获得更好的性能:

ALTER TABLE cache ADD INDEX name_expire_ndx (name,expire);
Run Code Online (Sandbox Code Playgroud)

如果您经常清除缓存,请记住运行ANALYZE TABLE cachel

也许每周一次,运行OPTIMIZE TABLE cache;以缩小表。