使用比较运算符时的 MYSQL 性能
Posted
技术标签:
【中文标题】使用比较运算符时的 MYSQL 性能【英文标题】:MYSQL Performance when using comparative operator 【发布时间】:2012-09-13 21:11:12 【问题描述】:我有一个 mysql 数据库,其中有一个包含大约 40k 条目的表。执行以下语句大约需要 10 秒(已选择数据库):
SELECT * FROM MyTable WHERE Column < 3
为什么需要这么长时间?如何提高性能? 其他数据库更快吗? (例如 MongoDB、CouchDB、...)不过我更喜欢使用 MySQL 数据库。
编辑:
以下查询...
EXPLAIN SELECT * FROM MyTable WHERE Column < 3;
结果如下:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE Occurances index NULL SearchString 102 NULL 40242 Using where; Using index
以下查询显示列中值的分布
SELECT COUNT(*), Column FROM MyTable GROUP BY Column;
结果如下:
COUNT(*) Column
43 0
5 1
106 2
71 3
42 4
283 5
2337 6
9491 7
22073 8
1191 9
1064 10
1105 11
919 12
393 13
288 14
288 15
200 16
123 17
71 18
71 19
36 20
10 21
13 22
8 23
4 24
3 25
4 29
【问题讨论】:
【参考方案1】:我敢猜测您在Column
列上没有索引。尝试创建一个:
CREATE INDEX idx_MyTable_Column ON MyTable (Column);
尝试比较创建索引前后EXPLAIN
的输出:
EXPLAIN SELECT * FROM MyTable WHERE Column < 3;
您应该看到,使用索引执行了索引扫描(或更好)。
只有当足够少的行集符合您的条件时,索引才会对您有所帮助。如果大部分表与表达式 Column < 3
匹配,则索引将无济于事,并且规划器将退回到表扫描,因为这会比使用索引更快。
如果您想要更详细的答案,则必须提供更多信息。这两个查询的输出会很有帮助:
EXPLAIN SELECT * FROM MyTable WHERE Column < 3;
SELECT COUNT(*), Column FROM MyTable GROUP BY Column;
以及MyTable
上的索引列表。
【讨论】:
感谢您的快速响应,我添加了查询的输出。似乎只有一小部分符合标准(possible_keys
在 select 输出中是 NULL
——这意味着您的所有索引都对该查询没有用处。请添加您在此表上的索引列表。
啊,那是我的错误……我索引了错误的列。现在查询大约需要 0.0005 秒。除了使用索引之外,还有其他方法可以加快速度吗?
可能,但在 0.0005 秒时,我不确定其他任何事情都会产生任何实质性影响。 :)【参考方案2】:
您应该使用 Apache Solr 作为索引,但速度太快,例如使用 Apache Solr instagram Netflix、eBay、Digg、AOL 等。
您阅读了有关 apache solr 的信息。我相信您会 更多参考
apache solr http://lucene.apache.org/solr
wiki apache solr
【讨论】:
我真的不认为“这个查询性能不好”的答案是“使用不同的数据库引擎”。【参考方案3】:对于 40k 记录的简单选择,这似乎异常缓慢。如果表太大而无法存储在内存中(即可用内存非常少,或者您将大文件直接存储在表中),那么 MySQL 将花费更长的时间来运行查询。
对列进行索引也会产生巨大的影响,尽管对于即使在条件列上没有索引但适合内存的表来说 10 秒似乎非常慢。
Why MySQL could be slow with large tables?
【讨论】:
以上是关于使用比较运算符时的 MYSQL 性能的主要内容,如果未能解决你的问题,请参考以下文章
SQL基础教程(第2版)第2章 查询基础:2-2 算数运算符和比较运算符
比较 T-SQL Between 和 '<' '>' 运算符的性能差异?
在 JavaScript 比较中应该使用哪个等号运算符(== vs ===)?