SQL優化(SQL 索引)

2022-06-29 01:00:13 字數 2023 閱讀 4074

檢視表定義:

show create

table users;

檢視表的索引:

show index

from users;

你要獲取第乙個表的所有資訊,你說全表掃瞄快呢還是索引掃瞄快呢?所以當你查詢庫(包括left join中的臨時庫)的所有資訊時,資料庫會選擇最優方法——全表掃瞄!!!

/*

s表dept_id、name,及d表的id_o均加了索引!!!

*//*

(只使用了d表的索引)導致只有s表內容全的,d表只現示s.name='zs'對應的值

*/explain

select s.name,d.name from student s left

join dept d on s.dept_id = d.id_o and s.name='zs

'/*(使用了雙表的索引),很值得記住的寫法left join on where!!!

*/explain

select s.name,d.name from student s left

join dept d on s.dept_id = d.id_o where s.name='zs

'

1. 首先應考慮在 where 及 order by 涉及的列上建立索引,使用選擇率高的字段建索引。

聯合索引group by 要在where 之前。

2. 不使用 != 或 <> 操作符。

3. 不使用 is null 或 is not null

可以在num上設定預設值0,確保表中num列沒有null值,然後這樣查詢:

select id from t where num=

0

4. 不使用 or

可以這樣查詢:

select id from t where num=

10union

allselect id from t where num=

20

5. 如果like是以『%』開始,將不會使用索引

6. 不使用 in 和 not in

對於連續的數值,能用 between 就不要用 in 了:

select id from t where num between

1and

3

7. 不在where進行函式運算

8. 使用復合索引的第一部分(即最左字首原則)

9. 建議 exists 代替 in (注意兩邊表的數量多少)

exists用於檢查子查詢是否至少會返回一行資料,該子查詢實際上並不返回任何資料,而是返回值true或false

exists(包括 not exists )子句的返回值是乙個bool值。 exists內部有乙個子查詢語句(select ... from...), 我將其稱為exist的內查詢語句。

其內查詢語句返回乙個結果集。 exists子句根據其內查詢語句的結果集空或者非空,返回乙個布林值。

一種通俗的可以理解為:將外查詢表的每一行,代入內查詢作為檢驗,如果內查詢返回的結果取非空值,則exists子句返回true,這一行行可作為外查詢的結果行,否則不能作為結果。

10. 索引並不是越多越好,可以提高select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引(b+tree的insert導致樹結構變化)

索引基數

索引基數是資料列所包含的不同值的數量。索引的基數相對於資料表行數較高的時候,它的工作效果最好。

若查詢優化器發現某個值出現在表的資料行中的百分比很高的時候,它一般會忽略索引,進行全表掃瞄。慣用的百分比界線是」30%」

索引選擇性

索引選擇性=索引基數/資料總數

越接近1就越有可能利用索引,也可以理解1為百分百

高索引選擇性的好處就是mysql查詢匹配的時候可以過濾更多的行,唯一索引的選擇性最佳,值為1。

sql索引優化

1 b tree索引 b tree索引的特點 以b 樹的結構儲存資料 能加快資料的查詢速度 更適合進行範圍查詢 什麼情況下可以用到b樹索引 1 全值匹配的查詢 eg sn 1111 1111 1111 1111 2 匹配最左字首的查詢 eg sn 1111 3 匹配範圍值的查詢 eg sn sn 4...

SQL優化 索引

索引說白了其實就是一種用於快速查詢資料的資料結構。像我在之前的工作裡mysql資料庫用的比較多一些,我了解的mysql底層索引使用的資料結構是b tree。你像b tree它其實就是在b tree的基礎上優化而來的,b tree和b tree最大的區別就是b tree不管是葉子節點還是非葉子節點除了...

SQL優化 索引

sql優化 背景 執行慢,索引失效,伺服器引數不合理 快取,執行緒數 優化 主要是 優化索引。索引相當於目錄。index是幫助mysql高效查詢獲取資料的資料結構。不加索引 乙個乙個找,慢 加了索引 根據索引找,快 mysql索引 b樹 小的放左邊,大的放右邊。排好序的結構。索引缺點 1 索引本身很...