mysql联合查询sql优化
我們在使用mysql數據庫時,經常會使用到mysql的聯合查詢,聯合查詢分為內連接和外連接,內連接查詢結果是聯合的表都存在匹配才會有結果,外連接則根據驅動表是否存在匹配來生成結果集。
這里使用mysql用例數據庫employees舉例,聯合查詢時的一些優化。這里涉及到的表主要是employees和salaries表。
mysql內連接查詢時,查詢優化器會選擇數據量較小的表作為驅動表。employees表大概是30萬的數據量,salaries則接近200萬。
我們不知道哪些表作為驅動表合適,可以使用join,讓mysql優化器幫我們做出選擇。
explain select e.emp_no, s.salary from employees e join salaries s on e.emp_no = s.emp_no order by s.salary limit 10;explain的結果表明mysql使用employees表作為驅動表,結果集一次查詢會包含接近30萬的數據,由于要根據工資字段進行排序,這里使用到了臨時表和文件排序。這是由于mysql的聯表查詢的執行策略,是循環嵌套查詢,即mysql先在一個表中循環取出單條數據,然后再嵌套循環到下一個表中尋找匹配的行,以此類推,直到找到所有表中匹配的行為止。所對被驅動表的字段進行排序時,會產生臨時表,并采用文件排序,在數據量很大的時候效率是很慢的。
為了在排序的時候使用上索引,和不使用臨時表。我們先對salary字段建立索引。
alter table salaries add index(salary);
接著我們采用left join,使用salaries表作為驅動表。
explain select e.emp_no, s.salary from salaries s left join employees e on e.emp_no = s.emp_no order by s.salary;
可以看到查詢時使用了索引。結果集也會根據limit分頁來決定。
轉載于:https://www.cnblogs.com/fishisnow/p/6719439.html
總結
以上是生活随笔為你收集整理的mysql联合查询sql优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前台页面Base64加密与服务端Base
- 下一篇: Android开发经验之在图片上随意点击