MySQL 的 count(*) 的优化,获取千万级数据表的总行数
一、前言
這個(gè)問題是今天朋友提出來的,關(guān)于查詢一個(gè)1200w的數(shù)據(jù)表的總行數(shù),用count(*)的速度一直提不上去。找了很多優(yōu)化方案,最后另辟蹊徑,選擇了用explain來獲取總行數(shù)。
二、關(guān)于count的優(yōu)化
網(wǎng)上關(guān)于count()優(yōu)化的有很多。博主這邊的思路就是沒索引的就建立索引關(guān)系,然后使用count(1)或者count()來提升速度。這兩個(gè)函數(shù)默認(rèn)使用的是數(shù)據(jù)表中最短的那個(gè)索引字段。我朋友這邊因?yàn)楸碇兄挥幸粋€(gè)索引字段,所以使用count(1)和count()沒什么區(qū)別。
MySQL中聚合函數(shù)count的使用和性能優(yōu)化
(https://blog.csdn.net/lmy86263/article/details/73681633)
mysql count(*) 會(huì)選哪個(gè)索引?
(https://blog.csdn.net/zbdba/article/details/47753721)
大家可以參考這兩個(gè)博客,都挺不錯(cuò)的。
三、使用explain獲取行數(shù)
1、關(guān)于explain
關(guān)于explain,使用mysql的都知道,這個(gè)函數(shù)是專門用于查看sql語句的執(zhí)行效率的,網(wǎng)上可供參考的文章很多。
定義: explain 命令速度很快,因?yàn)?explain 用并不真正執(zhí)行查詢,而是查詢優(yōu)化器【估算】的行數(shù)。
我們使用explain之后,會(huì)看到返回很多參數(shù),其中:
rows:顯示MySQL認(rèn)為它執(zhí)行查詢時(shí)必須檢查的行數(shù)。就是這個(gè)東西了,既然我們要獲取的是數(shù)據(jù)表的行數(shù),那么可以使用:
2、關(guān)于返回值
以前博主也沒注意過返回值的問題,都是直接通過phpmyadmin來查看sql的執(zhí)行效率。這次因?yàn)橐玫絩ows的值,所以就打印了一下,原來這個(gè)explain函數(shù)是會(huì)返回一個(gè)數(shù)組。這樣我們就能通過這個(gè)數(shù)組獲取到我們需求的rows。
這里直接獲取這個(gè)值即可。速度極快。原來查詢速度是2.33s,換成只用explain之后,速度僅為0008s,提升十分巨大。
總結(jié)
以上是生活随笔為你收集整理的MySQL 的 count(*) 的优化,获取千万级数据表的总行数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最佳开发工具大全!前谷歌工程师两年打造“
- 下一篇: 数据库并发控制,选择乐观锁还是悲观锁?