咱們在使用mysql數據庫時,常常會使用到mysql的聯合查詢,聯合查詢分爲內鏈接和外鏈接,內鏈接查詢結果是聯合的表都存在匹配纔會有結果,外鏈接則根據驅動表是否存在匹配來生成結果集。mysql
這裏使用mysql用例數據庫employees舉例,聯合查詢時的一些優化。這裏涉及到的表主要是employees和salaries表。sql
mysql內鏈接查詢時,查詢優化器會選擇數據量較小的表做爲驅動表。employees表大概是30萬的數據量,salaries則接近200萬。數據庫
咱們不知道哪些表做爲驅動表合適,能夠使用join,讓mysql優化器幫咱們作出選擇。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字段創建索引。spa
alter table salaries add index(salary);code
接着咱們採用left join,使用salaries表做爲驅動表。blog
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分頁來決定。排序