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
下率很高