數據局庫的索引優化
MySQL索引
MySQL的B-tree索引特色:
1. B-tree索引以B+樹的結構存儲數據
2. B-tree索引可以加快數據的查詢速度
3. B-tree索引更適合進行範圍查找
使用場景:
1. 全職匹配的查詢
2. 匹配最左前綴的查詢
3. 匹配列前綴查詢
4. 匹配範圍值得查詢
5. 精確匹配左前綴並範圍匹配另一列
6. 只訪問索引的查詢
7. 只訪問索引查詢
Btree索引的使用限制
1. 若是不是按照索引的最左列開始查找,則沒法使用索引
2. 使用索引時不能跳過索引中左邊的列
3. not in和<>操做沒法使用索引
4. 若是查詢中有某個列的範圍查詢,則其右邊全部列都沒法使用索引
MySQL的Hash索引特色:
1. Hash索引時基於Hash表實現的,只有查詢條件精確匹配Hash索引中的全部列時,纔可以使用帶hash索引
2. 對於Hash索引中的全部列,存儲引擎都會爲每一行計算一個Hash碼,Hash索引中存儲的就是Hash碼
Hash索引的使用限制:
1. Hash索引必須進行二次查找
2. Hash索引沒法用於排序
3. Hash索引不支持部分索引查找也不支持範圍查找
4. Hash索引中的Hash碼計算可能存在Hash衝突
索引的做用:
- 索引大大減小了存儲引擎須要掃描的數據量
- 索引能夠幫助咱們進行排序以免使用臨時表
- 索引能夠把隨機IO變爲順序IO
索引是否是越多越好???
- 索引會增長寫操做的成本
- 太多的索引會增長查詢優化器的選擇時間
安裝時演示的數據庫:
索引的優化策略:
索引列上不能使用表達式或者函數:
select ... from product where todays(out_date)-todays(current_date)<=30
select ...from product where out_date<=date_add(current_date,interval 30 day)
前綴索引和索引列的選擇性:
create index index_name on table(col_name(n));
※ 索引的選擇性是不重複索引值和表的記錄數的比值
聯合索引:
如何選擇索引列的順序:
1. 常常會被使用的列優先的原則
2. 選擇性高的列優先原則
3. 寬度小的列優先原則
覆蓋索引:
- 優勢:
1. 能夠優化緩存,減小磁盤IO操做
2. 能夠減小隨機IO,變隨機IO操做爲順序IO
3. 能夠避免對InnoDB主鍵索引的二次查詢
4. 能夠避免MyISAM表進行系統調用
- 缺點:
1. 存儲引擎不支持覆蓋索引(eg:memory)
2. 查詢中使用了太多的列
3. 使用了雙%號的like查詢
使用索引來優化排序:
1. 經過排序操做
2. 按照索引順序掃描數據
> 條件:
1. 索引的列順序和order by子句的順序徹底一致
2. 索引中全部列的方向(升序,降序)和order by子句徹底一致
3. order by中的字段所有在關聯表中的第一張表中
使用Btree索引模擬Hash索引對查詢進行優化:
alter table film add title_md5 varchar(32);
update film set title_md5 = md5(title);
create index idx_md5 on film(title_md5);
explain select * from film where title_md5=md5('EGG IGBY') and title='EGG IGBY';# [在不一樣版本的數據庫中有可能不支持]
使用Btree索引模擬Hash索引對查詢進行優化的限制:
1. 只能處理鍵值得全值匹配查找
2. 所使用的Hash函數決定着索引鍵的大小
經過使用索引優化鎖
1. 索引能夠減小鎖定的行數
2. 索引能夠加快處理速度,同時也加快了鎖的釋放
刪除重複和冗餘的索引:pt-duplicate-key-checker h=127.0.0.1
如何使用pt-duplicate-key-checker檢查冗餘索引連接 查找未被使用的索引: 經過SQL語句查詢進行檢查: 更新索引統計信息及減小索引碎片:analyze table table_name/optimize table table_name[使用不當時會致使鎖表]