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 的行为有可能不同吗?
如果没有索引,每次都会进行全表扫描。很高兴您为表格建立了索引。
我建议您创建一个复合索引,以便随着表的增长获得更好的性能:
ALTER TABLE cache ADD INDEX name_expire_ndx (name,expire);
Run Code Online (Sandbox Code Playgroud)
如果您经常清除缓存,请记住运行ANALYZE TABLE cachel
也许每周一次,运行OPTIMIZE TABLE cache;以缩小表。
| 归档时间: |
|
| 查看次数: |
209 次 |
| 最近记录: |