使用比较运算符时的MYSQL性能

时间:2012-09-13 21:11:13

标签: mysql database performance query-optimization

我有一个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

3 个答案:

答案 0 :(得分:3)

我冒昧地猜测你在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上的索引列表。

答案 1 :(得分:1)

你应该使用Apache Solr作为索引并且速度太快,例如使用Apache Solr instagram Netflix,eBay,Digg,AOL等。

你读到关于apache solr的信息......我相信你会的 更多参考资料

apache solr http://lucene.apache.org/solr

wiki apache solr

答案 2 :(得分:0)

对于40k记录上的简单选择,这似乎非常慢。如果表太大而无法存储在内存中(即可用的内存非常少,或者您将大型文件直接存储在表中),那么MySQL将花费更长的时间来运行查询。

对列进行索引也会产生巨大的差异,尽管即使条件列上没有索引,10s对于适合内存的表来说似乎非常慢。

Why MySQL could be slow with large tables?