MySQL使用count(*)命令慢的解决方案

MySQL使用count(*)命令慢的解决方案,第1张

笔者目前在负责一个简单的Spring Boot项目,该项目有一个 *** 作日志的功能。在分页查询 *** 作日志时,需要查询日志的记录数。日志记录也不大,23W左右,比起其他大项目一两百W,少很多了。但是,令人困惑的是,使用count(*)查询总数时,总是十分缓慢,在20s左右,使得打开 *** 作日志非常慢。

于是我改成了count(1)、count(id),然而都不行。

网上资料说MySQL对count(*)做了特别的优化,按理来说应该是最快的,然而三个都不约而同的非常慢。

解决方案是,为ID加了个唯一键:

之后再使用count(*)便能正常查询了:

对于这个问题的原因,依旧没能想明白为什么。欢迎大家相互讨论~

优化总结:

1.任何情况下SELECT COUNT(*) FROM xxx 是最优选择;

2.尽量减少SELECT COUNT(*) FROM xxx WHERE COL = ‘xxx’ 这种查询;

3.杜绝SELECT COUNT(COL) FROM tablename WHERE COL = ‘xxx’ 的出现。(其中COL非主键)

环境:

MySQL版本:5.0.45

OS:Windows XP SP3

数据表一:sphinx

+———-+——————+——+—–+———+—————-+

| Field| Type | Null | Key | Default | Extra |

+———-+——————+——+—–+———+—————-+

| id | int(10) unsigned | NO | PRI | NULL| auto_increment |

| til | varchar(100) | NO | | ||

| content | text | NO | | ||

| dataline | int(11) | NO | | ||

+———-+——————+——+—–+———+—————-+

记录数:1120100

查询一:

mysql>select count(*) as totalnum from sphinx

+———-+

| totalnum |

+———-+

| 1120100 |

+———-+

1 row in set (0.00 sec)

查询二:

mysql>select count(*) as totalnum from sphinx where id>1000

+———-+

| totalnum |

+———-+

| 1119100 |

+———-+

1 row in set (2.17 sec)

查询三:

mysql>select count(*) as totalnum from sphinx where id>1000

+———-+

| totalnum |

+———-+

| 1119100 |

+———-+

1 row in set (0.61 sec)

查询四:

mysql>select count(*) as totalnum from sphinx where id>1000

+———-+

| totalnum |

+———-+

| 1119100 |

+———-+

1 row in set (0.61 sec)

查询五:

mysql>select count(id) as totalnum from sphinx

+———-+

| totalnum |

+———-+

| 1120100 |

+———-+

1 row in set (0.00 sec)

查询六:

mysql>select count(til) as totalnum from sphinx where id>1000

+———-+

| totalnum |

+———-+

| 1119100 |

+———-+

1 row in set (1 min 38.61 sec)

查询七:

mysql>select count(id) as totalnum from sphinx where id>11000

+———-+

| totalnum |

+———-+

| 1109100 |

+———-+

1 row in set (0.61 sec)

查询八:

mysql>select count(id) as totalnum from sphinx

+———-+

| totalnum |

+———-+

| 1120100 |

+———-+

1 row in set (0.03 sec)

结论:

在 select count() 没有 where 条件的时候 select count(*) 和 select count(col) 所消耗的查询时间相差无几。

在 select count() 有 where 条件的时候 select count(col) 所消耗的查询时间 比 select count(*) 明显多出数量级的时间。

欢迎转载,本文标题:MySQL count(*) 与 count(col) 查询效率比较

转载请注明原文网址:http://zz.dsidc.cn/html/shujuku/MYSQL/2014/0209/9478.html


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7407370.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-05
下一篇 2023-04-05

发表评论

登录后才能评论

评论列表(0条)

保存