淺談MySQL之select優化方案
我們是否看到過在公司中許多查詢語句都是select * xxxx
心中的想法肯定是,別人寫了select *,那我寫吧,省去了不少麻煩事兒
慢查詢 首先去思考,最基本的,是否我們使用的數據庫插查詢語句存在了訪問的數據太多 其實大部分性能低的查詢往往都可以通過減少訪問的數據量來優化的 因為select * 會給服務器帶來額外的I/O、內存和cpu的消耗數據庫中慢查詢開銷的三個指標
相應時間 掃描的行數 返回的行數如果走了索引
select * from stu where id = 1;
索引會優化查詢,只返回十條數據如果沒有id索引,那么就會預估訪問上百上千行數據
tips: 通過mysql中的EXPLAIN命令去查看的其中rows對應的行數
其實最好的情況就是在存儲引擎層過where濾掉不匹配的記錄其次好的情況是覆蓋索引命中掃描,在服務器層where濾掉不匹配的記錄,不需要回表查詢最的情況是從數據表返回數據,然后再過濾不滿足條件的記錄
如何去優化使用索引覆蓋,把我們需要的列都放在索引中,這樣我們就避免了回表去查詢可以單獨分出來表
3.重構查詢(可以進行大的查詢化解成小的查詢)
舉例: 如count、limit、max()
countcount 最好的優化就是增加匯總表,因為count不可避免需要掃描大量的行
limitlimit我們在做分頁的時候很常用,如下面代碼
select id from stu order by id limit 1000,20;
這條語句會查詢1020條數據然后丟掉前一千條返回1000~1020的二十條數據那么優化的最好的方式就是走索引,這樣limit查詢查就能變成已知位置的查詢
最大值最小值min&max首先我們試想如果走的是主鍵索引,那么我們去查詢的時候第一個的值就是我們要返回的最小值我們也可以走主鍵索引以后,用limit去控制數據量,這樣就實現了min()函數的效果,從而替換掉min
select id from stu use index(primay) where address = ’bj’ limit 1;
這樣就盡可能掃描了少的記錄數
最后我們來做兩道題放松一下吧
找出`Employee` 表中第二高的薪水(Salary)+----+--------+| Id | Salary |+----+--------+| 1 | 100 || 2 | 200 || 3 | 300 |+----+--------+結果+---------------------+| SecondHighestSalary |+---------------------+| 200 |+---------------------+解答select max(Salary) SecondHighestSalaryfrom Employee where salary < (select max(salary)from Employee)
查找 `Person` 表中所有重復的電子郵箱。+----+---------+| Id | Email |+----+---------+| 1 | a@b.com || 2 | c@d.com || 3 | a@b.com |+----+---------+結果+---------+| Email |+---------+| a@b.com |+---------+解答select Email from Person group by Email having count(Email) >= 2;
到此這篇關于淺談MySQL之select優化方案的文章就介紹到這了,更多相關MySQL select優化內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!
相關文章: