何时在连接表上添加索引

Geo*_*rge 4 mysql indexing select join where

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

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

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

更新 - 添加表和查询

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

SELECT COUNT(*) as salescount, items.itemName, CONCAT(items.ID, items.productcode) as itemId 
FROM items JOIN sales ON items.itemId = sales.itemId WHERE items.StoreName = ? 
AND sales.storeID = ? GROUP BY items.ItemId ORDER BY salescount DESC LIMIT 10;
Run Code Online (Sandbox Code Playgroud)

这是销售表:

+----------------+------------------------------+------+-----+---------+-------+
| Field          | Type                         | Null | Key | Default | Extra |
+----------------+------------------------------+------+-----+---------+-------+
| StoreId        | bigint(20) unsigned          | NO   |     | NULL    |       |
| ItemId         | bigint(20) unsigned          | NO   |     | NULL    |       |
+----------------+------------------------------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)

和项目表:

+--------------------+------------------------------+------+-----+---------+-------+
| 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    |       |
+--------------------+------------------------------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)

Qua*_*noi 5

你应该指数将要搜索的领先表中在各个领域WHERE中的条款,并在驱动表WHEREJOIN条款。

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

只需在此处发布您的查询,我可能会告诉您如何为表建立索引。

更新:

您的查询最多将返回11作为COUNT(*)

这将选择具有给定StoreID(即PRIMARY KEY)的销售,并加入销售itemId和给定中的项目StoreName(此组合也是一个PRIMARY KEY)。

此连接要么成功(返回1行)要么失败(不返回任何行)。

如果成功,COUNT(*)将是1

如果这确实是您想要的,那么您的表就可以很好地建立索引。

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

更新 2:

  1. 在上创建复合索引 sales (storeId, itemId)

  2. 请确保您PRIMARY KEYitems定义为(StoreName, ItemId)(按顺序)。

    如果PK被定义为(ItemID, StoreName),则在 上创建索引items (StoreName, ItemID)

  • 这个答案对我来说似乎很普遍 - 如您所知,`WHERE LastName like '%Smith%'` 或 `WHERE SUBSTRING(ID, 2, 1) = '2'` 根本不会从索引中受益。 (2认同)