Mysql 什么索引可以确保此查询快速运行?

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 ------------------

您好,我有3张桌子
房间
房间
。每个表上都有数百万行。我基本上只是想用下面的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,它包括优化/性能的基础知识——直接导致索引、计划、统计和可搜索性。学习并应用这些基础知识后,请重新优化。