【发布时间】:2017-12-01 16:33:15
【问题描述】:
考虑以下架构(在sqlFiddle 上可用)
create table ad (
id int primary key auto_increment,
category_id int,
city_id int,
name varchar(255),
key(category_id),
key(city_id)
);
create table category (
id int primary key auto_increment,
name varchar(255)
);
create table city (
id int primary key auto_increment,
name varchar(255)
);
insert into category values (null, 'Category 1');
insert into category values (null, 'Category 2');
insert into category values (null, 'Category 3');
insert into city values (null, 'City 1');
insert into city values (null, 'City 2');
insert into ad values (null, 1, 1, "Category 1 city 1");
insert into ad values (null, 1, 2, "Category 1 city 2");
insert into ad values (null, 2, 1, "Category 2 city 1");
insert into ad values (null, 2, 2, "Category 2 city 2");
insert into ad values (null, 3, 1, "Category 3 city 1");
insert into ad values (null, 3, 2, "Category 3 city 2");
当执行没有任何顺序的简单连接查询时:
SELECT ad.id, ad.name, category.name, city.name FROM ad
INNER JOIN category ON category.id = ad.category_id
INNER JOIN city ON city.id = ad.city_id
结果相当高效:
但是,一旦我添加了 ORDER BY 子句,就会涉及到临时表和文件排序:
SELECT ad.id, ad.name, category.name, city.name FROM ad
INNER JOIN category ON category.id = ad.category_id
INNER JOIN city ON city.id = ad.city_id
ORDER BY ad.id
如何优化这样的查询?
【问题讨论】:
-
如果您需要排序,则需要一个临时表来构建要排序的值,然后对结果值进行排序......问题在哪里??????
-
感谢您的宝贵意见。