索引概念和作用
索引是一種使記錄有序化的技術,它可以指定按某 列/某幾列預先排序,從而大大提高查詢速度(類似 於漢語詞典中按照拼音或者筆畫查詢)。
索引的主要作用是加快資料查詢速度,提高資料庫 的效能。
mysql索引型別
從物理儲存角度上,索引可以分為聚集索引和非聚 集索引。
1.聚集索引(clustered index)
聚集索引決定資料在磁碟上的物理排序,-個表只 能有乙個聚集索引。
2.非聚集索引(non-clustered index)
引上只包含被建立索引的資料,以及乙個行定位符 row-locator, 這個行定位符,可以理解為乙個聚集 索引物理排序的指標,通過這個指標,可以找到行 資料
從邏輯角度,索引可以分為以下幾種。
1.普通索引:最基本的索引,它沒有任何限制。2.唯一索引:與普通索引類似,不同的就是索引 列的值必須唯一-, 但允許有空值。如果是組合 索引,則列值的組合必須唯-
3.主鍵索引:它是一種特殊的唯一 索引,用於唯ll 一標識資料表中的某一條記錄, 不允許有空 值,- -般用primary key來約束。主鍵和聚 集索引的關係詳見"問題詳解」中的第4題。4.聯合索引(又叫復合索引) :多個欄位上建立 的索引,能夠加速復合查詢條件的檢索。5.全文索引:老版本 mysql自帶的全文索引 只能用於資料庫引擎為myisam的資料表, 新版本mysql 5.6的innodb支援全文索引 預設mysql不支援中文全文檢索,可以通過 擴充套件mysql,新增中文全文檢索或為中文內 容表提供對應的英文索引表的方式來支援
mysql索引優化規則
可以通過以下規則對mysql索引進行優化。
1.前導模糊查詢不能使用索引。
例如下面sql語句不能使用索引。
select * fromdoc where title like '%xx』 而非前導模糊查詢則可以使用索引,如下面的sql 語句。
select * fromdoc where title like 『xx%』
頁面搜尋嚴禁左模糊或者全模糊,如果需要可以用 搜尋引擎來解決。
2.union、 in、 or 都能夠命中索引,建議使用in。
示例**如下:
select * fromdoc where status=1
unionall
select * fromdoc where status=2
直接告訴mysql怎麼做,mysql 耗費的cpu最 少,但是-般不這麼寫sql。
●in:能夠命中索引。.
示例**如下:
select * fromdoc where status in (1, 2) 查詢優化耗費的cpu比union all多,但可以忽略 不計,一般情況下建議使用in
●or:新版的mysql能夠命中索引。
示例**如下:
select * fromdoc where status= 1 or status =2 查詢優化耗費的cpu比in多,不建議頻繁用or。3.負向條件查詢不能使用索引, 可以優化為in查 詢
負向條件有: !=、<>、not in、not exists、not like 等
例如下面**:
select * fromdoc where status != 1 and status != 2 可以優化為in查詢:
select * fromdoc where status in (0,3,4)
4.聯合索引最左字首原則(又叫最左側查詢)
●如果在(a,b,c)三個欄位上建立聯合索引,那麼 它能夠加快a i(a,b) |(a,b,c)三組查詢速度。
例如登入業務需求,**如下。
selectuid,
login_ time from user where login. name=? andpas 可以建立(login name, passwd)的聯合索引。
因為業務上幾乎沒有passwd的單條件查詢需求, 而有很多login name的單條件查詢需求,所以可
(passwd, login. name)。
●建聯合索引的時候,區分度最高的字段在最左
●如果建立了(a,b)聯合索引,就不必再單獨建立 a索引。同理,如果建立了(a,b,c)聯合索引,
就不必再單獨建立a、(a,b) 索引。
●存在非等號和等號混合判斷條件時,在建索引 時,請把等號條件的列前置。如where a>?
and b=?,那麼即使a的區分度更高,也必須
把b放在索引的最前列。
●最左側查詢需求,並不是指sql語句的 where順序要和聯合索引- -致。
下面的sql語句也可以命中(login. name, passwd) 這個聯合索引。
selectuid,
login
time from user where passwd=? andlogin. na me=2
但還是建議where後的順序和聯合索引一致,養成 好習慣。
5.範圍列可以用到索引(聯合索引必須是最左前
●範圍列可以用到索引(聯合索引必須是最左前』 綴) ,但是範圍列後面的列無法用到索引,索 引最多用於- -個範圍列,如果查詢條件中有兩| 個範圍列則無法全用到索引。
假如有聯合索引(empno、title、 fromdate), 那麼 下面的sql中emp. no可以用到索引,而title和 from .date則使用不到索引。
select * fromemployees. titles where emp_no< 10010』 and title='senior engineer and from date between 『1986-01-01』 and 『1986-12-31』
6.把計算放到業務層而不是資料庫層。
附:如果使用
select * fromdoc where create time<=year ( '2016-03-12 12:12:12);
依然會用到索引;
●在字段上進行計算不能命中索引。
例如下面的sql語句。
select * fromdoc where year(create_ time)<= 『2016』
即使date.上建立了索引,也會全表掃瞄,可優化為 值計算,如下:
select * fromdoc where create _time <= 『201 6-01-
●把計算放到業務層。
這樣做不僅可以節省資料庫的cpu,還可以起到查 詢快取優化效果。
比如下面的sql語句:
select * fromorder where date < = curdate( 可以優化為:
select * fromorder where date < = 2018-01-2412:00:00』
優化後的sql釋放了資料庫的cpu多次呼叫,傳 入的sql相同,才可以利用查詢快取。
7.強制型別轉換會全表掃瞄
如果phone欄位是varchar型別,則下面的sql不 能命中索引。
select * fromuser where phone=13800001234
可以優化為:
select * fromuser where phone='13800001234』8.更新十分頻繁、資料區分度不高的字段上不宜建 立索引。
●更新會變更b+樹,更新頻繁的字段建立索引 會大大降低資料庫效能
「性別」這種區分度不大的屬性,建立索引是沒
有什麼意義的,不能有效過濾資料,效能與全 表掃瞄類似。
explain
6 mysql
1)、id列數字越大越先執行,如果說數字-樣大,那麼就 從上往下依次執行,id列為null的就表是這是一乙個結果集, 不需要使用它來進行查詢。
2)、select type列常見的有:
a: ******:表示不需要nion操作或者不包含子查詢的簡 單select查詢。 有連線查詢時,外層的查詢為simplnple, 且 有乙個
selet, 1最個需要union操作或者含有子查詢的 b: primary: 乙個需要u select, 位於最外層的單位查詢的select. type即為
c: union: union連線的兩個select查詢,第- -個查詢是 dervied派生表, 除了第- -個表外,第二個以後的表 select type都是union
d: dependent union;與union- 樣,出現在union 或union al語句中,但是這個查詢要受到外部查詢的影響 e: union result:包含union的結果集,
語句中,因為它不需要參與的,果集,在nion和ounion al
i subquery:除了from字句中包含的子查詢外,其他地方
的子查詢都可能是subquery
g: dependent subquery:與dependent union類似,表示 這個subquery的查詢要受到外部表查詢的影響 h: derived: from字句**現的子查詢,也叫做派生表, 其他資料庫中可能叫做內聯檢視或巢狀select
3)、table
是別名,如秦不,如果查詢使用了別名,那麼這裡顯示的. 顯示的查詢表名,如果查詢使用 死梨名,如果不涉及對資料表的操作,那麼這顯示為nul,
示為尖括號括起來的就表示這個是臨時 表,後邊的n就是執行計畫中的id,表示結果來自於這個查
詢產生。如果是尖括號括起來的
MySQL優化 如何定位效率較低的SQL
hacms開源社群 一般通過以下兩種方式定位執行效率較低的 sql 語句。慢查詢日誌在查詢結束以後才紀錄,所以在應用反映執行效率出現問題的時候查詢慢查詢日誌並不能定位問題,可以使用 show processlist 命令檢視當前 mysql 在進行的執行緒,包括執行緒的狀態 是否鎖表等,可以實時地查...
MySQL優化 如何定位效率較低的SQL
一般通過以下兩種方式定位執行效率較低的 sql 語句。下面我們舉例說明一下,如何通過慢查詢日誌定位執行效率底的 sql 語句 開啟慢查詢日誌 配置樣例 mysqld log slow queries 在 my.cnf 配置檔案中增加上述配置項並重啟 mysql 服務,這時 mysql 慢查詢功能生效...
優化sql,避免影響sql的執行效率
1.避免使用 select from 表名 只查詢需要的需要的字段 如果表字段較多,用到的字段佔表字段中的少數,使用select 造成資源浪費,影響sql執行效率 但是如果查詢的表字段較少,或者表中80 資料字段都是需要用到的,可以使用select from 表名 2.限制結果集的資料量。查詢時不要...