mysql索引整理
一.索引:
1.創建一般索引 create index index_name on table_name(columnname[...]);?
2.分析sql執行語句 在select 之前加explain eg:explain select * from table_name;
3.mysql從5.5.5之后默認采用innerdb為默認的存儲引擎,該引擎支持的兩種常見索引:b+樹索引和hash索引,hash索引的效率高于b+樹,但hash索引只支持=類型。
b+樹可以支持范圍的eg:>< ,b+樹一般三層即可表示,即訪問3次io可找到數值。
?
二.常見丟失索引的情況
1.左前綴法則:建立的聯合索引,如果查詢條件沒有第一個帶索引的列,則會丟失索引效果。
2.在索引的列表上有函數eg:max() left() avg(),則會丟失索引
3.使用<>或!=會無法使用索引 遇到不等于的情況,建議改用范圍查詢大于 or 小于
4.建議少用or
5.is null && is not null 會引起全表掃描
6.varchar類型字段加'' 否則會出現2的場景,因為mysql會隱式轉化,先將數字轉成varchar
數據庫中定義為日期類型的字段,查詢時程序中用str_to_date轉成日期在查詢,否則mysql也會進行隱式轉化
7.like '%_%' && like '%_' 會引起全表掃描,將%放在右邊eg: like '_%'能引用到索引,索引類型type=range
實際情況下如果左右兩邊都要加百分號,我們可以用覆蓋索引來解決,eg: select name from table where name like '%name%'; create index index_name on table(name,age);
要求所查詢的字段必須被索引所覆蓋到,在explain的時候,輸出的extra信息中如果有“Using Index”,就表示這條查詢使用了覆蓋索引,這就是覆蓋索引。
在mybatis持久層框架中我們可以用concat拼接的方式處理。
8.減少select * 的使用
?
三
1.小表驅動大表
select * from A where id in (select id from B); 當B表的數據集小于A表的數據集時,用in比exists效率高
2.order by:默認為升序,index高于filesort,遵照索引建的最佳左前綴原則
mysql4.1之后改進為單路排序,一次查詢所需的列,如果buffer不足夠大,會導致重復訪問io,可適當調整sort_buffer_size max_length_for_sort_date 參數值
3.group by: 同order by,且where 高于 having,限制條件盡量卸載where中
4.開啟慢查詢日志:set global show_query_log=1;(只對當前數據庫有效,重啟后失效)
設置慢查詢的時間值3秒:set global long_query_time=3
使用mysql提供的mysqlddumpshow查詢慢日志的所需的信息 eg:得到訪問次數最多的10個SQL:mysqldumpslow -s c -t 10 /var/lib/mysql/sunys.log
5.使用show profile 查看sql執行的生命周期,進行sql分析:
?關注status的四種狀態:1)converting HEAP to MyISAM 查詢結果太大,內存不夠用往磁盤上寫2)Creating tmp table 創建臨時表(拷貝數據到臨時表再刪除耗性能)3)copying to tmp table on disk 把內存中的臨時表復制到磁盤4)locked ?
四:mysql鎖
1.無索引行鎖會升級為表鎖:
update/delete sql盡量帶上where條件并在where條件中設定索引過濾條件,否則會鎖表,性能低效。
轉載于:https://www.cnblogs.com/sunys/p/6916750.html
總結
- 上一篇: 关于微信小程序的的总结
- 下一篇: MySQL的简单使用-(一)