程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL查詢優化:銜接查詢排序淺談

MySQL查詢優化:銜接查詢排序淺談

編輯:MySQL綜合教程

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved