mysql范围查询性能

标签 mysql performance indexing range

我有一个包含 40000 行的简单 MySQL 表:

id CHAR(36) (i am using UUIDs as primary keys)
number_from (INT)
number_to (INT)

有 3 个索引:

primary(id)
number_from(number_from)
number_to(number_to)

看起来像下面这样的简单查询需要相当大的时间 时间量(例如 30 秒或更长时间):

SELECT * FROM numbers WHERE (number_from >= 703911711 AND number_to <= 703911800)

我可以做些什么来优化性能?

最佳答案

将索引分开将强制 MySQL 单独扫描它们。如果您同时索引 number_fromnumber_to ,MySQL 可以在单个索引上执行整个 where 子句:

CREATE INDEX number_from_number_to_ind
ON numbers (number_from, number_to)

id 添加到索引实际上将允许 MySQL 在不访问表的情况下执行整个查询,但代价是使索引显着变大。您必须进行基准测试,看看这是否真的提高了查询的性能:

CREATE INDEX all_columns_ind
ON numbers (number_from, number_to, id)

关于mysql范围查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29797205/

相关文章:

php - 我想根据 DATETIME 计算今天/昨天日期的所有行 - mysql+php

mysql order by 在此请求中

javascript - Javascript 数字是否在 32 位浏览器中表示为 64 位数字?

php - mysql插入日期时间不输出正确的时间

python - 迭代 Pandas DataFrame 并插入行的最快方法

javascript - 如何一次缩小多个 HTML/CSS 文件?

Django-Haystack + Whoosh - 重建索引后的空索引

database - 为什么数据库中不使用 trie 索引来进行字符串索引?

mysql - 从数据库表 VB.NET 中获取最后 3 位/字符