聊聊Navicat統(tǒng)計(jì)的行數(shù)竟然和表實(shí)際行數(shù)不一致的問(wèn)題
背景
近期為了保障線上數(shù)據(jù)庫(kù)的穩(wěn)定性,我決定針對(duì)一些大表的歷史數(shù)據(jù)有計(jì)劃地進(jìn)行備份遷移,但是呢,發(fā)現(xiàn)一個(gè)奇特的現(xiàn)象,Navicat統(tǒng)計(jì)行數(shù)和表自身count統(tǒng)計(jì)數(shù)竟然不一致???0.0
Navicat
Navicat作為數(shù)據(jù)庫(kù)管理工具,在業(yè)界廣受歡迎,先甭管你電腦上現(xiàn)在正在運(yùn)行的Navicat是正版還是盜版(你不說(shuō)我也知道),不可否認(rèn)的是,在我從事17年從事后端開(kāi)發(fā)以來(lái),嘗試了很多同類(lèi)工具,Navicat在功能上完全碾壓其他數(shù)據(jù)庫(kù)管理工具,尤其是細(xì)節(jié)方面,在這里不一一列舉了,總之一個(gè)字,就是很好用(不接受反駁,除非你說(shuō)出來(lái)一個(gè)讓我心服口服的工具)。
整個(gè)經(jīng)過(guò)
這次大表遷移備份,我的整體思路是:首先用Navicat對(duì)庫(kù)內(nèi)所有的表按照行數(shù)降序排序,然后選取Top10進(jìn)行遷移備份。但是一如既往細(xì)心的我發(fā)現(xiàn),它界面的統(tǒng)計(jì)行數(shù)竟然和我自己count這張表行數(shù)不一致?!難道要顛覆我對(duì)Navicat的認(rèn)可嘛。
select count(1) from big_table_name;
為什么呢?
這讓我很是詫異,一度以為自己出現(xiàn)了幻覺(jué),再三確認(rèn)自己沒(méi)有帶VR眼鏡后,我踏上了尋找答案的征程。我開(kāi)始思考,Mysql作為一個(gè)數(shù)據(jù)庫(kù),自身肯定就有各個(gè)表的統(tǒng)計(jì),而Navicat只是作為一個(gè)可視化界面,讓數(shù)據(jù)肉眼可見(jiàn)。
Navicat:這鍋我可不背。
為了證實(shí)我的猜想,我查閱了官方文檔及其他相關(guān)資料,果然,MySQL 在 information_schema.TABLES
表中息存放了所有表的信息。
select * from information_schema.TABLES;
查看了這張表以后,發(fā)現(xiàn)表里統(tǒng)計(jì)記錄TABLE_ROWS
字段的確實(shí)與事實(shí)count不符……
這又是為什么呢?
我又陷入了沉思,帶著疑惑,繼續(xù)翻閱著文檔,突然,看到MySQL官方文檔對(duì)TABLE_ROWS
的解釋?zhuān)?/p>
The number of rows. Some storage engines, such as MyISAM, store the exact count. For other storage engines, such as InnoDB, this value is an approximation, and may vary from the actual value by as much as 40% to 50%. In such cases, use SELECT COUNT(*) to obtain an accurate count.
看了這段話(huà)我頓悟啦,你是不是也明白怎么回事啦。什么?你沒(méi)看太明白?好吧,沒(méi)關(guān)系,你可能需要通過(guò)翻譯軟件的直譯+理解,才懂得其中真正的含義。原來(lái),
TABLE_ROWS
這個(gè)字段不同存儲(chǔ)引擎的計(jì)數(shù)規(guī)則不一致,比如MyISAM引擎這表存儲(chǔ)TABLE_ROWS
存儲(chǔ)的就是精確的行數(shù),而對(duì)于其他的存儲(chǔ)引擎,比如 InnoDB,這個(gè)值只是一個(gè)近似值,與實(shí)際值相差40%-50%左右。所以,在這種情況下,我們想要得到一個(gè)準(zhǔn)確的計(jì)數(shù),只能使用 SELECT COUNT(*) 來(lái)獲得。
那又如何修正呢?
雖然疑惑得到了解答。但,和我一樣有強(qiáng)迫癥的朋友肯定會(huì)問(wèn),如何修正這個(gè)值呢?真是知道越多,未知越多,網(wǎng)上說(shuō)可以通過(guò)
Analyze table big_table_name
得以更正這個(gè)數(shù)據(jù),但是我動(dòng)手執(zhí)行之后發(fā)現(xiàn),并不能更正數(shù)據(jù),且該操作不僅耗時(shí)還會(huì)鎖表,并不推薦使用……說(shuō)到這,我的強(qiáng)迫癥竟然不治自愈了。
到此這篇關(guān)于Navicat統(tǒng)計(jì)的行數(shù)竟然和表實(shí)際行數(shù)不一致的文章就介紹到這了,更多相關(guān)Navicat行數(shù)不一致內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
錯(cuò)誤代碼:1100 Table ''t_depart_info'' was not locked with LOCK T
這篇文章就是告訴大家如何解決錯(cuò)誤代碼:1100 Table 't_depart_info' was not locked with LOCK TABLES,遇到類(lèi)似問(wèn)題的朋友可以參考一下2015-10-108 種常用的 NoSQL 數(shù)據(jù)庫(kù)系統(tǒng)對(duì)比分析
這篇文章主要介紹了8 種 NoSQL 數(shù)據(jù)庫(kù)系統(tǒng)對(duì)比,需要的朋友可以參考下2016-02-02一步步教你使用Navicat工具創(chuàng)建MySQL數(shù)據(jù)庫(kù)連接
Navicat是一套快速、可靠并價(jià)格相當(dāng)便宜的數(shù)據(jù)庫(kù)管理工具,專(zhuān)為簡(jiǎn)化數(shù)據(jù)庫(kù)的管理及降低系統(tǒng)管理成本而設(shè),下面這篇文章主要給大家介紹了關(guān)于如何使用Navicat工具創(chuàng)建MySQL數(shù)據(jù)庫(kù)連接的相關(guān)資料,需要的朋友可以參考下2023-03-03sql連接查詢(xún)語(yǔ)句中on、where篩選的區(qū)別總結(jié)
接觸Sql語(yǔ)句時(shí)間挺長(zhǎng)時(shí)間了,聽(tīng)他人說(shuō)過(guò)sql語(yǔ)句的連接查詢(xún),但一直沒(méi)有認(rèn)真研究和使用過(guò)!下面這篇文章主要給大家介紹了關(guān)于sql連接查詢(xún)語(yǔ)句中on、where篩選兩者之間區(qū)別的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友們下面來(lái)一起看看吧。2017-07-07Sql Server下數(shù)據(jù)庫(kù)鏈接的使用方法
Sql Server下數(shù)據(jù)庫(kù)鏈接的使用方法...2006-12-12數(shù)據(jù)庫(kù)中的左連接(left join)和右連接(right join)區(qū)別
關(guān)于左連接和右連接總結(jié)性的一句話(huà),左連接 where只影向右表,右連接where只影響左表2012-06-06