使用比较运算符时的MYSQL性能
我有一个mysql数据库,其中一个表有大约40k个条目。执行以下语句大约需要10秒(已选择数据库):使用比较运算符时的MYSQL性能,mysql,database,performance,query-optimization,Mysql,Database,Performance,Query Optimization,我有一个mysql数据库,其中一个表有大约40k个条目。执行以下语句大约需要10秒(已选择数据库): 从MyTable中选择*,其中列
从MyTable中选择*,其中列<3
为什么这需要这么长时间?我如何提高性能其他数据库是否更快?(例如MongoDB、CouchDB等)不过我更喜欢使用MySQL数据库 编辑: 以下查询
EXPLAIN SELECT * FROM MyTable WHERE Column < 3;
以下查询显示列中值的分布
SELECT COUNT(*), Column FROM MyTable GROUP BY Column;
结果如下:
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
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
我冒昧地猜测,您在
列
列上没有索引。尝试创建一个:
CREATE INDEX idx_MyTable_Column ON MyTable (Column);
尝试在创建索引之前和之后比较EXPLAIN
的输出:
EXPLAIN SELECT * FROM MyTable WHERE Column < 3;
EXPLAIN从MyTable中选择*列<3;
您应该看到,使用索引执行索引扫描(或更好)
只有当一组足够小的行符合您的条件时,索引才会对您有所帮助。如果大多数表与表达式列<3
匹配,则索引将没有帮助,计划者将返回到表扫描,因为这将比使用索引更快
如果你想要一个更详细的答案,那么你必须提供更多的信息。这两个查询的输出将非常有用:
EXPLAIN SELECT * FROM MyTable WHERE Column < 3;
SELECT COUNT(*), Column FROM MyTable GROUP BY Column;
EXPLAIN从MyTable中选择*列<3;
从MyTable GROUP BY Column中选择COUNT(*),Column;
以及
MyTable
上的索引列表,我冒昧地猜测,列
列上没有索引。尝试创建一个:
CREATE INDEX idx_MyTable_Column ON MyTable (Column);
尝试在创建索引之前和之后比较EXPLAIN
的输出:
EXPLAIN SELECT * FROM MyTable WHERE Column < 3;
EXPLAIN从MyTable中选择*列<3;
您应该看到,使用索引执行索引扫描(或更好)
只有当一组足够小的行符合您的条件时,索引才会对您有所帮助。如果大多数表与表达式列<3
匹配,则索引将没有帮助,计划者将返回到表扫描,因为这将比使用索引更快
如果你想要一个更详细的答案,那么你必须提供更多的信息。这两个查询的输出将非常有用:
EXPLAIN SELECT * FROM MyTable WHERE Column < 3;
SELECT COUNT(*), Column FROM MyTable GROUP BY Column;
EXPLAIN从MyTable中选择*列<3;
从MyTable GROUP BY Column中选择COUNT(*),Column;
以及
MyTable
上的索引列表,对于40k记录的简单选择来说,这似乎非常慢。如果表太大,无法存储在内存中(即可用内存非常少,或者直接在表中存储大文件),那么MySQL将需要更长的时间来运行查询
对列进行索引也会产生巨大的影响,尽管对于一个适合内存的表来说,即使条件列上没有索引,10秒似乎也很慢
对于40k记录的简单选择来说,这似乎非常缓慢。如果表太大,无法存储在内存中(即可用内存非常少,或者直接在表中存储大文件),那么MySQL将需要更长的时间来运行查询 对列进行索引也会产生巨大的影响,尽管对于一个适合内存的表来说,即使条件列上没有索引,10秒似乎也很慢
您应该使用ApacheSolr作为索引,速度太快,例如使用ApacheSolr instagram Netflix、eBay、Digg、AOL等 你读过关于ApacheSolr。。我相信你会的 更多参考资料
您应该使用ApacheSolr作为索引,速度太快,例如使用ApacheSolr instagram Netflix、eBay、Digg、AOL等 你读过关于ApacheSolr。。我相信你会的 更多参考资料
感谢您的快速响应,我添加了查询的输出。似乎只有一小部分符合标准(<3)。我似乎已经在使用索引了。
可能的\u键
在select输出中为NULL
——这意味着没有任何索引对该查询有用。请在这张表上添加索引列表。啊,那是我的错误。。。我索引错了列。现在查询大约需要0.0005秒。除了使用索引,还有其他方法加快速度吗?可能,但在0.0005秒时,我不确定其他任何方法是否会产生任何实质性影响。:)感谢您的快速响应,我添加了查询的输出。似乎只有一小部分符合标准(<3)。我似乎已经在使用索引了。可能的\u键
在select输出中为NULL
——这意味着没有任何索引对该查询有用。请在这张表上添加索引列表。啊,那是我的错误。。。我索引错了列。现在查询大约需要0.0005秒。除了使用索引,还有其他方法加快速度吗?可能,但在0.0005秒时,我不确定其他任何方法是否会产生任何实质性影响。:)我真的不认为“此查询性能差”的答案是“使用其他数据库引擎”。我真的不认为“此查询性能差”的答案是“使用其他数据库引擎”