MySQL是我的索引好吗?

时间:2016-06-17 14:14:46

标签: mysql innodb

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

我有两张桌子:

  

1)"用户",字段:id,fullname,status,sex,...

     

2)"订单",包含字段ID,id_user,order_date

当我找到订单时,我将其链接到" id_user"表"用户" (ID)。

大约有1百万的用户和#34;状态"字段"订单"可以有10个不同的值。

主要索引

我在字段上有一个PRIMARY索引"用户:id",我相信它在查询时很有用,例如" SELECT FROM users USE INDEX(PRIMARY)WHERE(id = 33) "当我将订单链接到某个用户。我在表格#34;订单"中有类似的索引。这可能没问题。

问题

因为我会按照状态搜索订单然后将其链接到正确的用户,所以我在表格中的两个字段创建了索引"订单":

  

索引名称" status__id_user",字段(status,id_user)

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

  

SELECT * FROM命令USE INDEX(status__id_user),用户USE INDEX(PRIMARY)WHERE(orders.status =' new')AND(orders.id_user = users.id)

问题

我是否需要在两个字段上使用索引,因为我使用字段" id_user"来链接到用户表?如果我的索引是"命令"它会加快速度吗?表只是字段"状态"?在这种情况下,将选择100,000条记录,然后MySQL会将其链接到"用户"表以获得正确的用户。

我的问题是,无论如何我的索引都有助于加快查询的这一部分:

  

AND(orders.id_user = users.id)

谢谢!

1 个答案:

答案 0 :(得分:2)

以这种方式编写查询:

SELECT *
    FROM orders
    JOIN users  ON orders.id_user = users.id
    WHERE orders.status='new'

不要指定要使用的索引。

WHERE子句开始,看起来可能有用:INDEX(status)。但是因为" status"听起来像一个"旗帜"如果基数较低,优化程序可能决定忽略该索引,只需执行表扫描即可。 没关系。没关系,因为当索引不是很有选择性时,执行表扫描比索引和数据之间的跳转更快。无论如何,请将决定权交给Optimizer。

现在它正在处理orders,它需要JOINusers。唯一的方法是在id上建立一个索引。那个名字(" id")意味着它可能是PRIMARY KEY,是吗? (请提供SHOW CREATE TABLE。)

Index cookbook

你提到的另一个问题应该是

SELECT * FROM users WHERE id=33

而且,如前所述,PRIMARY KEY上的索引(id?)是正确的。

对于SELECTs,没有任何优势(至少对于INDEX(status, id_user))。您的选择包括所有列(*);它只获取id_user,然后这样的索引将覆盖"并且具有一些优势。