在一般的查詢中,都要求盡量圍繞建立的索引進行。針對索引,常用的有主鍵索引,單列索引,組合索引,索引合併等。
在評價索引時,關鍵看區分度。索引區分度=索引列唯一值/表記錄數。
如果在區分度很低的列上建索引,那索引掃瞄的rows會相當大,該索引的效能表現就基本接近全表掃瞄了。
是一種特殊的唯一索引,不允許有空值。
針對表的單一列設定索引。
針對表的多列按列順序設定索引。在組合索引中,基於btree的原理,存在乙個最左字首匹配原則。如下索引(mobile_price_create_index):
能用到索引的場景:
mobile=a時,可以用到索引的第一列。
mobile=a and create=c時,只能用到索引的第一列。
mobile=a and price=b時,可以用到索引的兩列。
mobile=a and price=b and create =c時,可以用到索引的三列。
mobile=a and price > b and create=c時,可以用到索引的前兩列。
mobile>a and price =b and create=c時,只能用到索引的第一列。
mobile=a and price=b and create>c時,可以用到索引的三列。
order by a時,可以用到索引。
mobile=a order by price時,第一列過濾,第二列排序,可以用到索引。
order by mobile desc,price desc時,此時兩列排序順序一致,可以用到索引。
mobile > a order by a時,範圍查詢在第一列,排序在第一列,可以用到索引。
用不到索引的場景:
price=b and create=c時,用不到索引。
order by b時,不能用到索引。
order by mobile desc,price asc時,此時兩列排序順序不一致,用不到索引。
mobile > a order by price時,範圍查詢在第一列,排序在第二列,第二列用不到索引。
這裡要宣告乙個誤區,引數的順序不影響使用組合索引。mobile=a and price=b and create =c 與 create=c and price=b and mobile=a是等價的。
索引的建立要根據最常使用的引數來設定,使用時,要盡量貼合索引來實現邏輯。
針對單錶的查詢,可以支援查詢條件使用多個索引,然後對查詢結果進行交集,並集,有序並集等處理。
mysql支援在針對單錶的查詢時,合併多個索引的查詢結果。
如下索引結構:
執行如下執行計畫:
explain select這個sql中使用了合併索引,分別針對gmt_create和mobile使用了2個索引。然後將其結果集求並集之後排序。*from trade_order where gmt_create >
'2018-06-02 13:25:23
'or mobile =
'mobile-3679
';
針對or的查詢條件,組合索引不能起到有效的作用。此時可以通過在條件上建單獨的索引,然後合併使用。
針對and的查詢條件,建立組合索引效率更好,退而求其次時,可以選擇建立多個索引,然後合併使用。
那如果出現慢查詢,可以根據執行計畫,看是否未命中索引,命中的索引區分度是否足夠,組合索引是否滿足最左字首的原則,如果索引只能命中一部分,是否可以通過合併索引的方式改進sql。
mysql 慢查詢分析
轉自花開的地方 mysql有乙個功能就是可以log下來執行的比較慢的sql語句,預設是沒有這個log的,為了開啟這個功能,要修改my.cnf或者在mysql啟動 的時候加入一些引數。如果在my.cnf裡面修改,需增加如下幾行 long query time 1 log slow queries lo...
mysql 慢查詢分析
mysql有乙個功能就是可以log下來執行的比較慢的sql語句,預設是沒有這個log的,為了開啟這個功能,要修改my.cnf或者在mysql啟動 的時候加入一些引數。如果在my.cnf裡面修改,需增加如下幾行 long query time 1 log slow queries log querie...
Mysql 慢查詢 分析
it運維專家網 自由平等,互助分享!mysql有乙個功能就是可以log 下來執行的比較慢的sql 語句,預設是沒有這個log 的,為了開啟這個功能,要修改my.cnf 或者在mysql 啟動的時候加入一些引數。如果在my.cnf 裡面修改,需增加如下幾行 long query time 10 log...