檢視表定義:
show createtable users;
檢視表的索引:
show indexfrom 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 between1and
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 索引本身很...