这是我的sql查询,大约需要3-4秒。使用yii2。
SELECT `hotel`.* FROM `hotel`
INNER JOIN `term` ON term.hotel_ID=hotel.ID
INNER JOIN `airport_term` ON airport_term.term_ID=term.ID
INNER JOIN `airport` ON airport.ID=airport_term.airport_ID
WHERE `airport`.`name` IN ('Vienna', 'Berlin', 'Prague')
GROUP BY `hotel`.`ID`
ORDER BY `rating` DESC
解释性查询:https://pastebin.com/nieqrm5m
显示创建表:https://pastebin.com/ws6yh3p5
基本上我要做的是:选择有维也纳机场的酒店
酒店:12k条记录,期限:290k条记录,机场\期限:200k条记录,机场:30条记录
有什么方法可以让这个查询更快吗?我已经在那些表上做了索引。
4条答案
按热度按时间9udxz4iz1#
我无法从您的表中看到所使用的数据类型,因此这是一个简短的回答:
您仅从酒店表中选择数据,因此:
不需要一个小组
不需要内部连接,使用左连接。
以及:
你是按等级排序的,试着把它作为一个索引。
where name in,使用where airport.name='vienna'可能提高速度
xeufq47z2#
把问题归结为基本问题。。。
xytpbqjk3#
查看查询以及优化器可能遇到的瓶颈,尝试添加以下索引。
正如您当前的查询一样,它可能正在查找
airport
先上桌,拿到tableairport_ID
然后还要翻阅电视上的每一张唱片airport_term
因为它没有办法很快找到term_ID
从airport_ID
.通过允许快速查找
term_ID
从airport_ID
在那20万张唱片中。anhgbhbe4#
我使用子查询而不是join将时间缩短了1/2。运行查询需要1-2秒。不太理想,但肯定有进步。我仍然需要加入酒店的子查询中进行一些过滤,但速度还是更快。
我不是Maven,但我认为我不是把每个酒店都加入到每个术语中,而是先筛选术语,然后选择合适的酒店。