Mysql 我的索引好吗?

Mysql 我的索引好吗?,mysql,innodb,Mysql,Innodb,我想知道我在MySQL(InnoDB)中的索引设置是否正确。我不是索引方面的专家,但从我读到的关于它们的信息中,我希望我能很好地理解它们。为了确保我是对的,我想问问这个社区的成员 我有两张桌子: 1) “用户”,带字段:id、全名、状态、性别 2) “订单”,带有字段id、id\u用户、订单\u日期 当我找到订单时,我通过“id_user”将其链接到表“users”(id) 大约有100万用户,“订单”中的“状态”字段可以有10个不同的值 主要指数 我在字段“users:id”上有一个主索引,我

我想知道我在MySQL(InnoDB)中的索引设置是否正确。我不是索引方面的专家,但从我读到的关于它们的信息中,我希望我能很好地理解它们。为了确保我是对的,我想问问这个社区的成员

我有两张桌子:

1) “用户”,带字段:id、全名、状态、性别

2) “订单”,带有字段id、id\u用户、订单\u日期

当我找到订单时,我通过“id_user”将其链接到表“users”(id)

大约有100万用户,“订单”中的“状态”字段可以有10个不同的值

主要指数

我在字段“users:id”上有一个主索引,我相信当我进行诸如“SELECT FROM users USE index(PRIMARY)WHERE(id=33)”之类的查询时,以及当我将订单链接到某个用户时,它会很有用。我在“订单”表中有类似的索引。这可能没问题

问题 因为我将按订单状态搜索订单,然后将其链接到正确的用户,所以我在表“订单”中的两个字段上创建了一个索引:

索引名“status\u id\u user”,字段(status,id\u user)

列出新订单并将其与正确用户链接的查询如下所示:

从订单使用索引(status\u id\u user)中选择*,用户使用索引(PRIMARY),其中(orders.status='new')和(orders.id\u user=users.id)

问题: 仅仅因为我链接到具有字段“id\u user”的用户表,我就需要在两个字段上建立索引吗?它是否加快了速度?或者,如果我在“orders”表中的索引只是按字段“status”进行的,情况会是一样的?在这种情况下,将选择100000条记录,然后MySQL将其链接到“users”表以获得正确的用户

我的问题是,我的索引是否有助于加快查询的这一部分:

和(orders.id_user=users.id)


谢谢大家!

按以下方式编写查询:

SELECT *
    FROM orders
    JOIN users  ON orders.id_user = users.id
    WHERE orders.status='new'
不要指定要使用的索引

WHERE
子句开始,它看起来可能很有用:
INDEX(status)
。但是,由于“status”听起来像是一个基数很低的“flag”,优化器可能会决定忽略索引,只进行表扫描。这没关系。这是可以的,因为当索引不是很有选择性时,执行表扫描比在索引和数据之间跳转更快。在任何情况下,都由优化器决定

现在它正在处理
订单
,它需要
加入
用户
。唯一的方法是在
id
上建立索引。该名称(“id”)意味着它可能是
主键,是吗?(请提供
显示创建表

你提到的另一个查询应该写出来

SELECT * FROM users WHERE id=33
如前所述,
id
上的索引(
PRIMARY KEY
?)是正确的


索引(status,id\u user)
没有任何优势(至少对于给定的
选择而言)。您的选择包括所有列(
*
);如果它只获取了
id\u user
,那么这样的索引将是“覆盖的”,并且有一些优势。

基本经验法则:在“决策”上下文中使用的任何字段都应该有一个索引。这是
where
join
order by
等中使用的任何内容。初始字段列表将
status
字段放在
user
表中。我认为这是不正确的?千万不要说优化器要使用哪个索引。你输了。优化器更好。更改查询,使优化器获取最佳索引。检查解释选择你的查询从我读到的,如果你做的地方由两个字段,它是有意义的创建2列索引,例如(姓氏,名字)。你是说我不应该使用索引(…)?这样做的目的是什么?我的意思是,如果我能确定哪一个指数是最好的,那就有意义了。如果优化器不知道呢?嗯,如果WHERE需要一个索引,orderby需要完全按照其他的东西进行排序呢?例如:从按状态排序(名称如“”)的用户中选择*?我应该有一个由两个字段组成的索引,或者在这种情况下需要什么类型的索引?MySQL会为这个查询使用两个索引(按名称索引和按状态索引)?