Mysql 何时在联接表上添加索引

Mysql 何时在联接表上添加索引,mysql,select,join,indexing,where,Mysql,Select,Join,Indexing,Where,我有一个mysql表,有900万条记录,但没有设置任何索引。我需要基于一个公共ID将其连接到另一个表中。我将为此ID添加一个索引,但在select和where子句中还有其他字段 我是否应该为where子句中的所有字段添加索引 select子句中的字段如何?我应该为所有字段创建一个索引,还是为每个字段创建一个索引 更新-添加表和查询 这里是查询-我需要根据商店名称和商店ID(商店名称和ID本身不是唯一的)逐项获取销售额、商品名称和商品ID 这是销售表: +----------------+----

我有一个mysql表,有900万条记录,但没有设置任何索引。我需要基于一个公共ID将其连接到另一个表中。我将为此ID添加一个索引,但在selectwhere子句中还有其他字段

我是否应该为where子句中的所有字段添加索引

select子句中的字段如何?我应该为所有字段创建一个索引,还是为每个字段创建一个索引

更新-添加表和查询

这里是查询-我需要根据商店名称和商店ID(商店名称和ID本身不是唯一的)逐项获取销售额、商品名称和商品ID

这是销售表:

+----------------+------------------------------+------+-----+---------+-------+
| Field          | Type                         | Null | Key | Default | Extra |
+----------------+------------------------------+------+-----+---------+-------+
| StoreId        | bigint(20) unsigned          | NO   |     | NULL    |       |
| ItemId         | bigint(20) unsigned          | NO   |     | NULL    |       |
+----------------+------------------------------+------+-----+---------+-------+
和项目表:

+--------------------+------------------------------+------+-----+---------+-------+
| Field              | Type                         | Null | Key | Default | Extra |
+--------------------+------------------------------+------+-----+---------+-------+
| ItemId             | bigint(20) unsigned          | NO   | PRI | NULL    |       |
| ProductCode        | bigint(20) unsigned          | NO   |     | NULL    |       |
| ItemName           | varchar(100)                 | NO   |     | NULL    |       |
| StoreName          | varchar(100)                 | NO   | PRI | NULL    |       |
+--------------------+------------------------------+------+-----+---------+-------+

您应该索引将在
WHERE
子句的前导表和
WHERE
JOIN
子句的驱动表中搜索的所有字段

使索引覆盖查询中使用的所有字段(包括
SELECT
orderby
子句)也会有所帮助,因为不需要表查找

只要在这里发布您的查询,我可能会告诉您如何为表编制索引

更新:

您的查询最多将返回
1
行,其中
1
作为
计数(*)

这将使用给定的
StoreID
(即
主键
)选择销售,并将销售的
itemId
和给定的
StoreName
(此组合也是
主键
)上的项目连接起来

此联接要么成功(返回
1
行),要么失败(不返回行)

如果成功,则
计数(*)
将为
1

如果它真的是您想要的,那么您的表就可以索引了

然而,在我看来,您的表设计有点复杂,在复制字段定义时,您只是遗漏了一些字段

更新2:

  • sales(storeId,itemId)

  • 确保将
    项目
    上的
    主键
    定义为
    (StoreName,ItemId)
    (按该顺序)

    如果将
    PK
    定义为
    (ItemID,StoreName)
    ,则会在
    项目(StoreName,ItemID)
    上创建索引

  • 索引是伟大的——当以正确的形式使用时。记住,索引必须被索引

    将索引集中在主键、共享键以及需要大量公共数据比较的字段上,如文本字段和日期范围


    正确使用索引是很好的,但索引不是万能的。即使是索引正确的表也可能会因为一个糟糕的查询和手腕的轻拍而崩溃。

    是的,您确实应该有索引,但它们应该适合您的所有查询。如果不在数据库中仔细搜索,就很难准确地推荐要配置的索引

    900万行足以使索引产生巨大的差异,但不会太大,以至于您无法承担一点修补

    一个粗略的解决方案是在items(storeid)、items(itemid、storename)、items(storename、itemid)、sales(itemid)、sales(storeid)、sales(itemid、storeid)和sales(storeid、itemid)上创建索引,然后删除未使用的索引


    C.

    这个答案对我来说似乎很一般-正如你所知道的,
    其中LastName像“%Smith%”
    其中SUBSTRING(ID,2,1)=“2”
    根本不会从索引中受益。由于缺乏信息,很难给出更具体的答案。但即使有了这些条件,查询仍然可以从索引中获益。如果表记录很大,则可以使用完整索引扫描来搜索记录,而不是使用完整表扫描<但是,code>MySQL不支持后期行查找,因此可能需要对查询进行重写。
    @Orbman
    :第一个查询,假设
    Smith
    是大写的,将受益于
    全文
    索引,该索引被重写为
    匹配(LastName)与(“+Smith*”在布尔模式下)
    。当然,这将在
    McSmiths
    和类似姓氏:)上失败。sales StoreId不是主键-我从表中删除了它。这个查询为我返回了多行,只是速度非常慢。
    +--------------------+------------------------------+------+-----+---------+-------+
    | Field              | Type                         | Null | Key | Default | Extra |
    +--------------------+------------------------------+------+-----+---------+-------+
    | ItemId             | bigint(20) unsigned          | NO   | PRI | NULL    |       |
    | ProductCode        | bigint(20) unsigned          | NO   |     | NULL    |       |
    | ItemName           | varchar(100)                 | NO   |     | NULL    |       |
    | StoreName          | varchar(100)                 | NO   | PRI | NULL    |       |
    +--------------------+------------------------------+------+-----+---------+-------+