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.總是去...