Mysql查詢語句優化之索引優化案例

2021-08-21 11:14:04 字數 1576 閱讀 1756

sql優化說到底還是索引的優化,建立索引並使之生效.

單錶優化

create table `student` (

`id` int (11) not null auto_increment,

`stuname` varchar (60) default null,

`age` int (11) default null,

`***` varchar (30) default null,

`gradename` varchar (60) default null,

primary key (`id`)

) engine = innodb auto_increment = 14 default charset = utf8 ;

insert into `student`(`id`,`stuname`,`age`,`***`,`gradename`) values (1,'張三',23,'男','一年級'),(2,'王峰',25,'男','二年級'),(3,'王峰',23,'男','一年級'),(4,'王峰',22,'男','三年級'),(5,'王峰',21,'女','一年級'),(6,'王峰',26,'女','二年級'),(7,'王峰',19,'男','三年級'),(8,'王峰',21,'女','二年級'),(9,'王峰',22,'男','一年級'),(10,'王峰',25,'男','二年級'),(11,'張三',21,null,'二年級'),(12,'王峰',23,'男','二年級'),(13,'王峰',24,null,'二年級');

查詢sql

select * from  student where ***='男' and age>22 order by gradename
使用explain分析如下

根據昨天的學習,很明顯發現是全表掃瞄而且出現了檔案內排序,必須優化.

此sql的條件有***,age用gradename來排序,因此我決定先給這三個欄位建索引,組合索引

再建立了組合索引index1之後,type的型別變為了ref,可是依然出現了檔案排序,

另一種嘗試,刪除index1索引,給***和gradname建立組合索引index2,結果如下

很明顯這次沒有出現檔案排序,並且type的級別是ref。

總結:第一次建立索引為什麼會出現檔案排序?

因為按照btree索引的工作原理,先排序***,如果遇到相同的***則在排序age,如果遇到相同的age,再排序gradname,而我第一次建的索引,在組合索引的中間,age>22又是乙個範圍值,mysql無法利用索引再對後面的gradname部分進行檢索了。

兩張表聯查優化

MySQL查詢優化之索引

mysql查詢優化之索引 什麼是索引 索引簡單來說就類似字典,想想我們小時候在中華字典怎麼查某個字。索引的作用就是快速找出在某個列中有一特定值的行。例如 有一張user表,其中有200萬條記錄,記錄著200萬個人的資訊。有乙個phone的字段記錄每個人的 號碼,現在想要查詢出 號碼為 x的人的資訊。...

mysql 索引優化器 Mysql之查詢優化器

對於乙個sql語句,查詢優化器先看是不是能轉換成join,再將join進行優化 優化分為 1.條件優化 2.計算全表掃瞄成本 3.找出所有能用到的索引 4.針對每個索引計算不同的訪問方式的成本 5.選出成本最小的索引以及訪問方式 開啟查詢優化器日誌 開啟 set optimizer trace en...

php mysql查詢優化 MySQL查詢優化

在我們使用mysql資料庫時,比較常用也是查詢,包括基本查詢,關聯查詢,條件查詢等等,對於同乙個操作,sql語句的實現有很多種寫法,但是不同的寫法查詢的效能可能會有很大的差異。這裡主要介紹下select查詢優化的要點。1.使用慢查詢日誌去發現慢查詢。2.使用執行計畫去判斷查詢是否正常執行。3.總是去...