高效能mysql 樹 高效能mysql精要

2021-10-17 22:34:56 字數 2517 閱讀 7407

1、explain 中 extra (using index ) 表示覆蓋索引,sql優化中最好能使用覆蓋索引,否則(二級索引)需要回表查詢。所謂覆蓋索引,是指要查詢的列正好是索引,而條件也是這個索引之一

2、where 語句中 條件等於主鍵的 ,在核心索引層完成,條件等於非索引的,在服務層完成

3、讀索引加共享鎖,讀主鍵加排他鎖

4、當有連線表而其中一條語句中有含有where = 主鍵的,優化器會優先執行這條語句,從而減少查詢的數量

5、最左字首原則,即 a,b,c為組合索引 ,語句 where a='a' and b='b' and c>'c' 可以使用索引,順序可以打亂,如 where b='b' and c>'c' and a='a' 。而where b='b' and a>'a' and c='c' 無法使用索引,因為 a>'a' 這裡使用了大於號不滿足最左字首原則

6、 %like% 無法使用索引,而like%可以

7、索引採用b+樹的原因:①b+樹樹高小於二叉樹,b+樹每一層等於物理記憶體中的一頁,每次io都把所有資料讀取出來,從而減少了訪問io的次數。②葉子節點是乙個單鏈表,在使用範圍 between 、in等語句時速度很快

8、由於資料庫的邏輯結構是根據索引排序,如果order by 不適用索引將會全表掃瞄,下面是乙個order by 的優化例子:

①select cols from profiles where *** ='m' order by rating limit 10;

其中 *** ,rating 聯合索引

②使用覆蓋索引

select cols from profiles inner join ( select primary key cols from profiles where x.***='m' order by rating limit 10000,10) as x using primary key cols

這裡子句使用了覆蓋索引

9、分解關聯查詢

好處① 讓快取的效率更高②減少鎖的競爭③查詢效率本身可能會提高④可以減少冗餘記錄

10、mysql執行的基礎:①客戶端->②查詢快取->③解析器->④解析樹->⑤預處理器->⑥查詢優化器->⑦查詢執行計畫->⑧查詢執行引擎->⑨api介面呼叫儲存引擎->⑩資料->11結果返回

11、mysql在from 子句中遇到子查詢時,先執行子查詢並將其結果放到乙個臨時表中(臨時表時沒有任何索引的,在編寫複雜子查詢和關聯查詢的時候需要注意),然後將這個臨時表當乙個普通表對待

12、mysql的執行計畫是一顆左側深度優先的樹

13、mysql 對where 條件中包含in()的子查詢語句實現的很糟糕(但對in()中包含列表則較好,特別是資料量大的時候)

14、extra 字段顯示"using index for group-by"表示使用鬆散索引掃瞄

15、最大值最小值優化:

select min(actor_id) from actor where first_name='penelope' first_name無法使用索引,改寫為:

select actor_id from actor using index(primary) where first_name ='penelope' limit 1;先使用主鍵索引,在服務層找到符合的後直接停止,因為主鍵本身就是排序好的

16、優化count()

select count() from city where id >5 改寫 為:

select (select count()from city-count()) from city where id<=5 子句是常量,父句數量少

17、優化關聯查詢:

①確保on 子句中的列上有索引,當表a和表b用c列關聯的時候,如果優化器的關聯順序是b、a,那麼就不需要在b表上對應列上建索引(因為b表是使用全表掃瞄)

②確保任何的group by 和order by 中的表示式只涉及到乙個表中的列

18、優化子查詢:

盡可能轉換為關聯查詢(不是絕對的)

19、優化group by:

如果需要對關聯查詢做分組,並且是按照查詢表中的某個列進行分組,那麼通常採用查詢表的標識列分組的效率會比其他的更高

select actor.first_name ,actor.last_name ,count() from film_actor inner join actor using(actor_id)

group by actor.first_name,actor.last_name 改寫為:

select actor.first_name ,actor.last_name ,count(*) from film_actor inner join actor using(actor_id)

group by actor.actor_id

20、mysql 可重複讀是如何實現的?

採用mvcc,是通過在每行記錄後面儲存兩個隱藏的列來實現的,這兩個列,乙個儲存了行的建立時間,乙個儲存了行的過期時間。儲存的不是時間而是系統版本號。①只查詢版本早於當前事務版本的資料行②行的過期版本要麼未定義,要麼大於當前事務版本號,這樣可以確保事務讀取到的行,在事務開始之前未過期

mysql高效能索引 mysql高效能索引( )

在開發中,我們知道大多數應用的瓶頸在於sql語句的執行時耗,在這裡並不討論sql語句的安全,僅僅討論高效能sql語句,而與高效能sql語句緊密相連的就是傳說中的 索引。索引 一種工作在儲存引擎端的用於快速找到記錄的一種資料結構。mysql使用索引的方式是 先找到索引的值,再根據索引的值找到資料行。索...

高效能mysql(一) 建立高效能索引

單列索引和多列索引 單列索引 多個單列索引的選擇問題 多個or條件 多個單列的效能往往效能很低,盡量建立高效的多列索引。多列索引 選擇合適的索引順序 避免範圍條件 在where子句中,in是有效的,範圍條件會導致後面的索引無效!在order by中,範圍條件和in都會導致無法按照索引排序!按照索引順...

建立高效能索引 《高效能Mysql》筆記2

crate table people last name varchar 50 not null,first name varchar 50 not null,dob date not null,gender enum m f not null,key last name,first name,do...