mysql索引使用率監(jiān)控技巧(值得收藏!)
概述
在關(guān)系數(shù)據(jù)庫(kù)中,索引是一種單獨(dú)的、物理的對(duì)數(shù)據(jù)庫(kù)表中一列或多列的值進(jìn)行排序的一種存儲(chǔ)結(jié)構(gòu),它是某個(gè)表中一列或若干列值的集合和相應(yīng)的指向表中物理標(biāo)識(shí)這些值的數(shù)據(jù)頁(yè)的邏輯指針清單。
mysql中支持hash和btree索引。innodb和myisam只支持btree索引,而memory和heap存儲(chǔ)引擎可以支持hash和btree索引
1、查看當(dāng)前索引使用情況
我們可以通過(guò)下面語(yǔ)句查詢當(dāng)前索引使用情況:
- Handler_read_first 代表讀取索引頭的次數(shù),如果這個(gè)值很高,說(shuō)明全索引掃描很多。
- Handler_read_key代表一個(gè)索引被使用的次數(shù),如果我們新增加一個(gè)索引,可以查看Handler_read_key是否有增加,如果有增加,說(shuō)明sql用到索引。
- Handler_read_next 代表讀取索引的下列,一般發(fā)生range scan。
- Handler_read_prev 代表讀取索引的上列,一般發(fā)生在ORDER BY … DESC。
- Handler_read_rnd 代表在固定位置讀取行,如果這個(gè)值很高,說(shuō)明對(duì)大量結(jié)果集進(jìn)行了排序、進(jìn)行了全表掃描、關(guān)聯(lián)查詢沒(méi)有用到合適的KEY。
- Handler_read_rnd_next 代表進(jìn)行了很多表掃描,查詢性能低下。
其實(shí)比較多應(yīng)用場(chǎng)景是當(dāng)索引正在工作,Handler_read_key的值將很高,這個(gè)值代表了一個(gè)行將索引值讀的次數(shù),很低的值表明增加索引得到的性能改善不高,因?yàn)樗饕⒉唤?jīng)常使用。
Handler_read_rnd_next 的值高則意味著查詢運(yùn)行低效,并且應(yīng)該建立索引補(bǔ)救。這個(gè)值的含義是在數(shù)據(jù)文件中讀下一行的請(qǐng)求數(shù)。如果正進(jìn)行大量的表 掃描,Handler_read_rnd_next的值較高,則通常說(shuō)明表索引不正確或?qū)懭氲牟樵儧](méi)有利用索引
2、查看索引是否被使用到
SELECT object_type, object_schema, object_name, index_name, count_star, count_read, COUNT_FETCH FROM PERFORMANCE_SCHEMA.table_io_waits_summary_by_index_usage;
如果read,fetch的次數(shù)都為0的話,就是沒(méi)有被使用過(guò)的。
3、查看使用了哪些索引
explain相關(guān)sql,查看type表示查詢用到了那種索引類(lèi)型
+-----+-------+-------+-----+--------+-------+---------+-------+ | ALL | index | range | ref | eq_ref | const | system | NULL | +-----+-------+-------+-----+--------+-------+---------+-------+
從最好到最差依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
- system 表中只有一條記錄,一般來(lái)說(shuō)只在系統(tǒng)表里出現(xiàn)。
- const 表示通過(guò)一次索引查詢就查詢到了,一般對(duì)應(yīng)索引列為primarykey 或者unique where語(yǔ)句中 指定 一個(gè)常量,因?yàn)橹黄ヅ湟恍袛?shù)據(jù),MYSQL能把這個(gè)查詢優(yōu)化為一個(gè)常量,所以非???。
- eq_ref 唯一性索引掃描。此類(lèi)型通常出現(xiàn)在多表的 join 查詢,對(duì)于每一個(gè)從前面的表連接的對(duì)應(yīng)列,當(dāng)前表的對(duì)應(yīng)列具有唯一性索引,最多只有一行數(shù)據(jù)與之匹配。
- ref 非唯一性索引掃描。同上,但當(dāng)前表的對(duì)應(yīng)列不具有唯一性索引,可能有多行數(shù)據(jù)匹配。此類(lèi)型通常出現(xiàn)在多表的 join 查詢, 針對(duì)于非唯一或非主鍵索引, 或者是使用了 最左前綴 規(guī)則索引的查詢.
- range 索引的范圍查詢。查詢索引關(guān)鍵字某個(gè)范圍的值。
- index 全文索引掃描。與all基本相同,掃描了全文,但查詢的字段被索引包含,故不需要讀取表中數(shù)據(jù),只需要讀取索引樹(shù)中的字段。
- all 全文掃描。未使用索引,效率最低。
順便提幾個(gè)優(yōu)化注意點(diǎn):
1、優(yōu)化insert語(yǔ)句:
1)盡量采用 insert into test values(),(),(),()...
2)如果從不同客戶插入多行,能通過(guò)使用insert delayed語(yǔ)句得到更高的速度,delayed含義是讓insert語(yǔ)句馬上執(zhí)行,其實(shí)數(shù)據(jù)都被放在內(nèi)存隊(duì)列中個(gè),并沒(méi)有真正寫(xiě)入磁盤(pán),這比每條語(yǔ)句分別插入快的多;low_priority剛好相反,在所有其他用戶對(duì)表的讀寫(xiě)完后才進(jìn)行插入。
3)將索引文件和數(shù)據(jù)文件分在不同磁盤(pán)上存放(利用建表語(yǔ)句)
4)如果進(jìn)行批量插入,可以增加bulk_insert_buffer_size變量值方法來(lái)提高速度,但是只對(duì)MyISAM表使用
5)當(dāng)從一個(gè)文本文件裝載一個(gè)表時(shí),使用load data file,通常比使用insert快20倍
2、優(yōu)化group by語(yǔ)句:
默認(rèn)情況下,mysql會(huì)對(duì)所有g(shù)roup by字段進(jìn)行排序,這與order by類(lèi)似。如果查詢包括group by但用戶想要避免排序結(jié)果的消耗,則可以指定order by null禁止排序。
3、優(yōu)化order by語(yǔ)句:
某些情況下,mysql可以使用一個(gè)索引滿足order by字句,因而不需要額外的排序。where條件和order by使用相同的索引,并且order by的順序和索引的順序相同,并且order by的字段都是升序或者降序。
4、優(yōu)化嵌套查詢:
mysql4.1開(kāi)始支持子查詢,但是某些情況下,子查詢可以被更有效率的join替代,尤其是join的被動(dòng)表待帶有索引的時(shí)候,原因是mysql不需要再內(nèi)存中創(chuàng)建臨時(shí)表來(lái)完成這個(gè)邏輯上需要兩個(gè)步驟的查詢工作。
最后提一個(gè)點(diǎn):
一個(gè)表最多16個(gè)索引,最大索引長(zhǎng)度256字節(jié),索引一般不明顯影響插入性能(大量小數(shù)據(jù)例外),因?yàn)榻⑺饕臅r(shí)間開(kāi)銷(xiāo)是O(1)或者O(logN)。不過(guò)太多索引也是不好的,畢竟更新之類(lèi)的操作都需要去維護(hù)索引。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
MySql超長(zhǎng)自動(dòng)截?cái)鄬?shí)例詳解
這篇文章主要介紹了MySql超長(zhǎng)自動(dòng)截?cái)鄬?shí)例詳解的相關(guān)資料,這里通過(guò)實(shí)例來(lái)說(shuō)明如何實(shí)現(xiàn)自動(dòng)截?cái)嗟墓δ?,需要的朋友可以參考?/div> 2017-07-07MySql存儲(chǔ)表情報(bào)錯(cuò)的排查解決
隨著互聯(lián)網(wǎng)的發(fā)展,產(chǎn)生了許多新類(lèi)型的字符,例如emoji這種類(lèi)型的符號(hào),也就是我們通常在聊天時(shí)發(fā)的小黃臉表情,下面這篇文章主要給大家介紹了關(guān)于MySql存儲(chǔ)表情報(bào)錯(cuò)的排查解決,需要的朋友可以參考下2022-07-07MySQL學(xué)習(xí)之?dāng)?shù)據(jù)庫(kù)備份詳解
本篇文章主要介紹了MySQL中的 數(shù)據(jù)庫(kù)備份詳解,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-09-09輕松掌握MySQL函數(shù)中的last_insert_id()
相信大家應(yīng)該都知道Mysql函數(shù)可以實(shí)現(xiàn)許多我們需要的功能,這篇文章介紹的Mysql函數(shù)Last_insert_id()就是其中之一,文章通過(guò)一個(gè)例子展開(kāi)來(lái)講,應(yīng)該更有助于大家的理解和學(xué)習(xí),有需要的朋友們下面來(lái)一起看看吧。2016-12-12新手必備之MySQL msi版本下載安裝圖文詳細(xì)教程
今天教大家怎么下載安裝MySQL msi版本,文中有非常詳細(xì)的圖文解說(shuō),對(duì)不會(huì)下載安裝mysql的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05MySQL字符集的基本類(lèi)型與統(tǒng)一字符集分析
此文章主要向大家描述的是MySQL字符集的基本類(lèi)型,以及統(tǒng)一字符集的實(shí)際操作方法,下面就是文章的主要內(nèi)容描述。2011-09-09MySql 索引、鎖、事務(wù)知識(shí)點(diǎn)小結(jié)
這篇文章主要介紹了MySql 索引、鎖、事務(wù)知識(shí)點(diǎn),總結(jié)分析了mysql數(shù)據(jù)庫(kù)中關(guān)于索引、鎖和事務(wù)的概念、原理、知識(shí)點(diǎn)及相關(guān)注意事項(xiàng),需要的朋友可以參考下2019-10-10詳解MySQL的字段默認(rèn)null對(duì)唯一索引的影響
這篇文章主要為大家介紹了MySQL的字段默認(rèn)null對(duì)唯一索引的影響詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09MySQL 5.5/5.6/5.7及以上版本安裝包安裝時(shí)如何選擇安裝路徑
最近mysql官方網(wǎng)站的安裝包從5.5-5.7起都是新版的安裝界面,各種環(huán)境要求支持,看樣子以后老點(diǎn)的系統(tǒng)安裝都?jí)蛸M(fèi)勁的了,這里腳本之家小編特為大家整理一下安裝步驟與方法2016-04-04最新評(píng)論