mysql 三 慢查詢分析 二

2022-05-03 21:00:10 字數 1871 閱讀 8432

在一般的查詢中,都要求盡量圍繞建立的索引進行。針對索引,常用的有主鍵索引,單列索引,組合索引,索引合併等。

在評價索引時,關鍵看區分度。索引區分度=索引列唯一值/表記錄數。

如果在區分度很低的列上建索引,那索引掃瞄的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

*from trade_order where gmt_create >

'2018-06-02 13:25:23

'or mobile =

'mobile-3679

';

這個sql中使用了合併索引,分別針對gmt_create和mobile使用了2個索引。然後將其結果集求並集之後排序。

針對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...