Mysql 什么索引可以确保此查询快速运行?
您好,我有3张桌子Mysql 什么索引可以确保此查询快速运行?,mysql,sql,database,indexing,inner-join,Mysql,Sql,Database,Indexing,Inner Join,您好,我有3张桌子人和房间,房间。每个表上都有数百万行。我基本上只是想用下面的sql语句(做我想做的事)查找所有在我的酒店住过的时间和他住过的房间。然而,当我运行这个语句时,它非常慢!我怎样才能加快速度?老实说,我相当肯定我的sql语句写得很糟糕。是否有更好的sql语句(我觉得内部连接可能非常慢)?我知道我也可以创建索引,但我不确定哪些列需要一起索引 主键 person\u id 房间id guest\u id 人 person_id | cus_num ------------------
人
和房间
,房间
。每个表上都有数百万行。我基本上只是想用下面的sql语句(做我想做的事)查找所有在我的酒店住过的时间和他住过的房间。然而,当我运行这个语句时,它非常慢!我怎样才能加快速度?老实说,我相当肯定我的sql语句写得很糟糕。是否有更好的sql语句(我觉得内部连接可能非常慢)?我知道我也可以创建索引,但我不确定哪些列需要一起索引
主键
person\u id
房间id
guest\u id
人
person_id | cus_num
----------------------
1 | 82736424
2 | 238748923
3 | 32424
4 | 2342424324
房间
room_id | name
----------------------
1 | Cool Room
2 | Hot Room
3 | Spring rooms
4 | apartment
guest_id | room_id | person_id | last_update
----------------------------------------------------
1 | 1 | 3 | 2019-02-03 12:00:43
2 | 4 | 2 | 2020-04-23 19:30:53
3 | 2 | 3 | 2018-12-21 08:34:29
4 | 3 | 1 | 2020-11-15 10:04:08
5 | 3 | 4 | 2019-05-09 11:53:31
客房客人
room_id | name
----------------------
1 | Cool Room
2 | Hot Room
3 | Spring rooms
4 | apartment
guest_id | room_id | person_id | last_update
----------------------------------------------------
1 | 1 | 3 | 2019-02-03 12:00:43
2 | 4 | 2 | 2020-04-23 19:30:53
3 | 2 | 3 | 2018-12-21 08:34:29
4 | 3 | 1 | 2020-11-15 10:04:08
5 | 3 | 4 | 2019-05-09 11:53:31
sql语句
SELECT rooms.name
FROM rooms
INNER JOIN room_guests ON rooms.room_id = room_guests.room_id
INNER JOIN person ON room_guests.person_id = person_id
WHERE person.cus_num = 2342424324
ORDER BY room_guests.last_update DESC
嗯
SELECT r.name
FROM rooms r JOIN
room_guests rg
ON r.room_id = rg.room_id JOIN
person p
ON rg.person_id = p.person_id
WHERE p.cus_num = 2342424324
ORDER BY rg.last_update DESC
我建议在以下方面建立索引:
person(客户编号、个人id)
room\u客人(个人id、房间id)
房间(房间id)
这将处理where
子句和join
s。查询仍然需要按
对顺序进行排序。您能否向我解释一下您是如何选择这些索引的,以及为什么使用连接
而不是内部连接
?另一个问题是,您为什么将客户数量
和个人id
索引在一起,而不仅仅是索引本身。为什么rooms
表中的rooms\u id
需要索引?它将是主键(编辑问题以指定主键)?。“内部联接”与“联接”相同。查看结果的EXPLAIN{query}
。在问题中包括SHOW CREATE TABLE{tablename}
,以避免混淆。主键非常合适,不需要重新编制索引。“cus_num和person_id在一起”。MySQL对每个表一次使用一个索引。WHERE子句需要cus\u num
,因此它是第一个,但随后需要使用person\u id加入room\u guests。因为这在将使用的索引中非常方便。如果person_id是主键,它将隐式地位于索引的末尾。@ZoeyMalkov。我使用JOIN
是因为我想格式化查询,以便更好地阅读,而且JOIN
更易于键入。解释是,这从'WHERE子句开始,然后通过连接进行。请在代码问题中给出一个——包括剪切&粘贴&可运行的最小代码和作为代码给出的最小代表性数据。对于包含DBMS和DDL的SQL,包括约束、索引和表格初始化。用于SQL性能,包括解释结果和统计信息。请研究并总结。对于SQL,它包括优化/性能的基础知识——直接导致索引、计划、统计和可搜索性。学习并应用这些基础知识后,请重新优化。