1. 程式人生 > >mysql sql語句調優及,索引總結

mysql sql語句調優及,索引總結

Mysql的索引

1.btree索引,btree索引是二叉平衡樹的結構表有(myisam innodb),

2.Hash索引,通過hash演算法計算到的索引是隨機的沒有規律(memory),沒有回杭

一、Btree索引

索引同時只能用上一個

查詢一條sql的執行計劃

Explain sql \G

此語句體現在 查詢時索引使用情況分

檢視sql執行的時間

Set profiling=on;

Show profiles;

如果要看具體那一條使用

Show profile for query 5 //具體哪一行

Show profile; //最新的sql的執行資訊

聚簇索引和非聚簇索引,非聚簇索引是對資料行的引用(索引指向磁碟資料行),聚簇索引是對主鍵的引用

Mysisam使用的是非聚簇索引,儲存的索引樹跟資料相互獨立分開的,使查詢時,需要回行

Innodb是聚簇索引,

注意: innodb來說,

1: 主鍵索引 既儲存索引值,又在葉子中儲存行的資料

2: 如果沒有主鍵(primary key), 則會Unique key做主鍵

3: 如果沒有unique,則系統生成一個內部的rowid做主鍵.

4: 像innodb中,主鍵的索引結構中,既儲存了主鍵值,又儲存了行資料,這種結構稱為”聚簇索引”

索引檔案和資料是粘合的(主鍵下掛在著資料),非主鍵索樹引指向主鍵是對主鍵的引用,

使用主鍵查詢時不需要回行,但根據其他的鍵進行查詢,需要回行

聚簇索引優勢在使用主鍵查詢時不需要回行,因為主鍵和資料是粘合的,

劣勢,如果插入不規則資料,就會不斷的造成索引的頁分裂,因為主鍵索引下掛載著資料,就會造成效能低下//我測試的一張表分別順序,和亂序插入10000條資料,相差60秒左右

測試指令碼執行時間

$str=microtime();//返回微秒數//如果引數為true 返回 秒數精確到毫秒

索引覆蓋

索引覆蓋就是查詢不走資料,只走索引檔案

重複索引和冗餘索引

重複索引會拖慢速度,冗餘索引會起到索引覆蓋的效果,查詢資料不用回行,效率更快

冗餘索引用的好是一種查詢優化策略

索引碎片與維護

優化方法一

Alter table sss engine innodb;//雖然表面沒有效果,但是他會把表裡的資料整理一遍,

優化方法二

專用方法

Optimize table 表名,會對資料進行整理把碎片優化

注意如果表的資料太大不要頻繁的操作,因為耗費資源

Sql語句優化

Sql語句好費時間的項

1.主要在沿著索引找鍵

2.取資料

優化

1.建立合理的聯合索引,區分度合適

2.取少的行和列

3.使用索引覆蓋技巧

思路1.不查->少查->高效的查

少查例子,比如一個網站的會員有多少,可以根據統計算每天的會員註冊數量,估算出會員數

少查,取較少的列

高效的查,沿著索引查

in查詢陷阱

mysql> explain select goods_id,cat_id from goods where cat_id in (select cat_id

from cat where parent_id=2) \G

goods表cat_id有索引

cat表cat_id 是主建

解決方式用連線查詢

*************************** 1. row ***************************

       id: 1

select_type: PRIMARY

    table: goods

     type: ALL

possible_keys: NULL

      key: NULL

  key_len: NULL

      ref: NULL

     rows: 24

    Extra: Using where

*************************** 2. row ***************************

       id: 2

select_type: DEPENDENT SUBQUERY

    table: cat

     type: unique_subquery

possible_keys: PRIMARY

      key: PRIMARY

  key_len: 4

      ref: func

     rows: 1

    Extra: Using where

原因,其實是先執行的是外部sql

獲得結果集,再子句中執行 select cat_id where cat_id=外層查到的cat_id and parent_id=2

此時子句就用到了主鍵,而主句用不到,要查詢的表很大,效率很低

改進

用連線查詢

mysql> explain select goods_id,goods.cat_id from goods inner join cat on goods.

cat_id=cat.cat_id \G

mysql> explain select goods_id,goods.cat_id from goods inner join cat on goods.

cat_id=cat.cat_id and cat.parent_id=2\G

*************************** 1. row ***************************

       id: 1

select_type: SIMPLE

    table: cat

     type: ALL

possible_keys: PRIMARY

      key: NULL

  key_len: NULL

      ref: NULL

     rows: 4

    Extra: Using where

*************************** 2. row ***************************

       id: 1

select_type: SIMPLE

    table: goods

     type: ref

possible_keys: pc

      key: pc

  key_len: 2

      ref: tpshop.cat.cat_id

     rows: 8

    Extra: Using where

下率很高