問題描述:由于公司線上服務(wù)器和線上是完全分離的,但是有時(shí)候線上環(huán)境的測試或排錯(cuò)還需要查看線上的數(shù)據(jù)庫,故這里給他們搭建了一個(gè)phpmyadmin的跳板機(jī),通過該平臺(tái)可以連接線上的只讀庫;但是最近收到同事的反饋,查看表記錄的庫時(shí)候,發(fā)現(xiàn)操作很卡,特別是瀏覽庫下的表的時(shí)候,而此時(shí)線上只讀庫有一個(gè)在select count(*) from tbname的會(huì)話,主機(jī)IP就是phpmyadmin服務(wù)器,到這里就明白了,查看庫下的表的時(shí)候,phpmyadmin會(huì)顯示表行數(shù),此操作嚴(yán)重拖累了phpmyadmin的響應(yīng),也問了百度和google,但是對(duì)于表數(shù)據(jù)量過多造成的phpmyadmin響應(yīng)慢都沒有太好的解決方案,所以自己摸索了一下,嘗試修改一下phpmyadmin的源碼,故我這里的解決方案就是修改phpmyadmin的源碼,將'select count(*) from tbname'的SQL改寫。
上面已概述了問題,現(xiàn)在直奔主題,說說如何修改phpmyadmin源碼解決這個(gè)問題的。
基礎(chǔ)環(huán)境:
操作系統(tǒng):Centos 6.5 x64位
phpmyadmin版本:ver 4.4.15.8
MySQL版本: 均為5.6.33
第一步: 既然我們知道是由于表行數(shù)統(tǒng)計(jì)造成,那么打開Table.class.php(phpmyadmin/libraries/Table.class.php)文件:
查找文件中的函數(shù)'static public function countRecords',修改內(nèi)容大概在581行前后
原SQL如下:
'SELECT COUNT(*) FROM ' . PMA_Util::backquote($db) . '.' . PMA_Util::backquote($table)
由于查詢information_schema表的字段都是varchar類型,需要給字段value添加單引號(hào),所以修改后的SQL如下:
'SELECT TABLE_ROWS FROM information_schema.TABLES where TABLE_SCHEMA = \'' . PMA_Util::backquote($db) . '\' and TABLE_NAME = \'' . PMA_Util::backquote($table) . '\''
第二步: 保存退出,然后重啟你的web服務(wù)apache或者nginx。
第三步: 登錄phpmyadmin,瀏覽庫下的表,直接秒開,完全無卡頓的現(xiàn)象了。
附注: 不過這時(shí)在庫下看到的表的紀(jì)錄數(shù),除了多于50W行的表示顯示行數(shù)的,其余表行數(shù)都是0,這時(shí)由于libraries/config.default.php中的 $cfg['MaxExactCount'] = 500000參數(shù)設(shè)置導(dǎo)致,如果一定要顯示正確的表行數(shù),可以把該參數(shù)設(shè)置為50000或者更低即可。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。