mysql索引的使用及語句優化

2021-05-06 14:25:47 字數 2674 閱讀 1037

一:mysql裡目前只支援4種索引分別是:b-tree,full-text,hash以及r-tree索引

b-tree索引應該是mysql裡最廣泛的索引的了,除了archive,基本所有的儲存引擎都支援它.

1.b-tree在myisam裡的形式和innodb稍有不同

在innodb裡面有兩種形態:其一是primary key形態其leaf node裡存放的是資料.而且不僅存放了索引鍵的資料,還存放了其他欄位的資料.其二是secondary index,其leaf node和普通的b-tree差不多,只是還存放了指向主鍵的資訊.

而在myisam裡,主鍵和其他的並沒有太大區別.不過和innodb不太一樣的地方是,在myisam裡,leaf node裡存放的不是主鍵的資訊,存的是指向資料檔案裡的對應資料行的資訊.

2.hash索引,目前我所知道的就只有memory和ndb cluster支援這種索引.

hash索引由於其結構,所以在每次查詢的時候直接一次到位不行b-tree那樣,一點點的前進,所以hash索引的效率高於b-tree.但hash也有缺點,主要如下:

(1)由於存放的是hash值,所以僅支援<=>以及in操作.

(2)hash索引無法通過操作索引來排序,這是因為存放的時候經過hash計算,但是計算的hash值和存放的不一定相等,所以無法排序.

(3)在組合所以裡,無法對部分使用索引.

(4)不能避免全表掃瞄,只是由於在memory表裡支援非唯一值hash索引,就是不同的索引鍵,可能存在相同的hash值.

(5)當存在大量相同hash值得時候,hash索引的效率會變低.

3.full-text索引

full-text在mysql裡僅有myisam支援它,而且支援full-text的字段只有char,varchar,以及text資料型別,full-text主要是用來代替like "%***%"效率低下的問題的.

4.r-tree索引

r-tree在mysql很少使用,僅支援geometry資料型別,支援該型別的儲存引擎只有myisam,bdb,innodb,ndb,archive幾種.相對於b-tree,r-tree的優勢在於範圍查詢.

二:mysql裡sql語句值得注意的地方

1.myisam裡所以鍵的長度僅支援1000位元組,innodb是767.

2.blob和text欄位僅支援字首索引.

3.使用!=以及<>不等於的時候mysql不使用索引.

4.當在字段時候函式的時候,mysql無法使用索引,在join的時候條件字段型別不一致的時候,mysql無法使用索引,在組合索引裡使用非第乙個索引時也不使用索引.

5.在使用like的時候,以%開頭,即"%***"的時候無法使用索引,在使用or的時候,要求or前後欄位都有索引.

有時候mysql query optimizer會認為使用索引並不是最優計畫,所以不使用索引,可以在sql語句裡可以用use,force index,當然有時候使用也不會比不用快,所以需要忽略掉index方法是ignore index.

關閉查詢快取sql_no_cache

select sql_no_cache * from table_name;

這樣可以讓一些很少使用的語句不放在快取裡,查詢的時候不會去快取裡找.對應的是強制快取sql_cache

select sql_cache * from table_name;

另外在my.cnf中如果設定query_cache_type=2的話,那麼只有在使用sql_cache後才會使用快取;

還有mysql裡的優先操作hight_priority讓mysql優先操作這個語句

select high_priority * fromtable_name;

與其對應的是low_priority;

mysql裡還有延時插入insert delayed

insert delayed into table_name....;#當提交之後,mysql返回ok,但不立即插入,二十當mysql有空再插入.假如等待時伺服器崩潰,那麼所有資料丟失!並且插入不會返回自增id.

再轉幾個技巧:

強制連線順序 straight_join

select table1.field1, table2.field2 from table1 straight_join table2 where …

由上面的sql語句可知,通過straight_join強迫mysql按table1、table2的順序連線表。如果你認為按自己的順序比mysql推薦的順序進行連線的效率高的話,就可以通過straight_join來確定連線順序。

強制使用臨時表 sql_buffer_result

select sql_buffer_result * from table1 where …

當我們查詢的結果集中的資料比較多時,可以通過sql_buffer_result.選項強制將結果集放到臨時表中,這樣就可以很快地釋放mysql的表鎖(這樣其它的sql語句就可以對這些記錄進行查詢了),並且可以長時間地為客戶端提供大記錄集。

分組使用臨時表 sql_big_result和sql_small_result

select sql_buffer_result field1, count(*) from table1 group by field1;

一般用於分組或distinct關鍵字,這個選項通知mysql,如果有必要,就將查詢結果放到臨時表中,甚至在臨時表中進行排序。sql_small_result比起sql_big_result差不多,很少使用。

Mysql 索引使用及優化

索引 排好序的快讀查詢資料結構 在資料之外,資料庫還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用 指向 資料,這樣就可以在這些資料結構上實現高階查詢演算法,這種資料結構就是索引 索引分類 單值索引 乙個索引只包含單個列,乙個表可以有多個單列索引 復合索引 乙個索引包含多個列 唯一索...

Mysql 索引及優化

索引是什麼?相信大家都用過字典。你是怎麼從厚厚的新華字典中找到你需要找到的那個字的呢?又是怎麼從一本書中快速定位到你需要的章節?我們都是通過書中的目錄,然後根據目錄中的頁碼定位到我們要的資訊。同樣在mysql中也是這樣為我們準備了乙份目錄。當你去通過sql語句查詢的時候用不用索引,以及怎麼用索引。決...

mysql索引及優化

mysql的索引可以從不同的維度來進行區分,如下 這是最基本的索引型別,基於普通字段建立的索引,沒有任何限制。與 普通索引 類似,不同的就是 索引欄位的值必須唯一,但允許有空值 在建立或修改表時追加唯一 約束,就會自動建立對應的唯一索引。它是一種特殊的唯一索引,不允許有空值。在建立或修改表時追加主鍵...