使用比较运算符时的 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 &lt; 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 和 '<' '>' 运算符的性能差异?

MySQL 在索引中使用自定义字符串比较运算符

在 JavaScript 比较中应该使用哪个等号运算符(== vs ===)?

在 JavaScript 比较中应该使用哪个等号运算符(== vs ===)?

在 JavaScript 比较中应该使用哪个等号运算符(== vs ===)?