我有一个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
答案 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的信息......我相信你会的 更多参考资料答案 2 :(得分:0)
对于40k记录上的简单选择,这似乎非常慢。如果表太大而无法存储在内存中(即可用的内存非常少,或者您将大型文件直接存储在表中),那么MySQL将花费更长的时间来运行查询。
对列进行索引也会产生巨大的差异,尽管即使条件列上没有索引,10s对于适合内存的表来说似乎非常慢。