MySQL查詢優化:銜接查詢排序淺談。本站提示廣大學習愛好者:(MySQL查詢優化:銜接查詢排序淺談)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL查詢優化:銜接查詢排序淺談正文
情形是這麼一個情形:如今有兩張表,team表和people表,每一個people屬於一個team,people中有個字段team_id。
上面給出建表語句:
create table t_team
(
id int primary key,
tname varchar(100)
);
create table t_people
(
id int primary key,
pname varchar(100),
team_id int,
foreign key (team_id) references t_team(id)
);
上面我要銜接兩張表查詢出前10個people,按tname排序。
因而,一個SQL語句出生了:select * from t_people p left join t_team t onp.team_id=t.id order by p.pname limit 10; [語句①]
這個是我第一反響寫的SQL,淺顯易懂,也是年夜多半人的第一反響。
然後來測試一下這個語句的履行時光。
起首要預備數據。我用存儲進程在t_team表中生成1000條數據,在t_people表中生成100000條數據。(存儲進程在本文最初)
履行下面那條SQL語句,履行了好幾回,耗時在3秒閣下。
再換兩個語句比較一下:
1.把order by子句去失落:select * from t_people p left join t_team t on p.team_id=t.id limit10; [語句②]
耗時0.00秒,疏忽不計。
2.照樣應用order by,然則把銜接t_team表去失落:select * from t_people p order by p.pname limit 10; [語句③]
耗時0.15秒閣下。
比較發明[語句①]的效力巨低。
為何效力這麼低呢。[語句②]和[語句③]履行都很快,[語句①]不外是兩者的聯合。假如先履行[語句③]獲得排序好的10條people成果後,再銜接查詢出各個people的team,效力不會這麼低。那末只要一個說明:MySQL先履行銜接查詢,再停止排序。
處理辦法:假如想進步效力,就要修正SQL語句,讓MySQL先排序取前10條再銜接查詢。
SQL語句:
select * from (select * from t_people p order by p.pname limit 10) p left join t_team t on p.team_id=t.id limit 10; [語句④]
[語句④]和[語句①]功效一樣,固然有子查詢,固然看起來很別扭,然則效力進步了許多,它的履行時光只需0.16秒閣下,比之前的[語句①]進步了20倍。
這兩個表的構造很簡略,假如碰到龐雜的表構造…我在現實開辟中就碰著了如許的成績,應用[語句①]的方法耗時80多秒,但應用[語句④]只需1秒之內。
最初給出造數據的存儲進程:
CREATE PROCEDURE createdata()
BEGIN
DECLARE i INT;
START TRANSACTION;
SET i=0;
WHILE i<1000 DO
INSERT INTO t_team VALUES(i+1,CONCAT('team',i+1));
SET i=i+1;
END WHILE;
SET i=0;
WHILE i<100000 DO
INSERT INTO t_people VALUES(i+1,CONCAT('people',i+1),i%1000+1);
SET i=i+1;
END WHILE;
COMMIT;
END
轉載自:http://blog.csdn.net/xiao__gui/article/details/8616224