4

我有一个 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;

这是销售表:

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

3 回答 3

5

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

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

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

更新:

您的查询最多将返回1一行1COUNT(*)

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

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

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

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

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

更新 2:

  1. 创建一个复合索引sales (storeId, itemId)

  2. 确保您定义为PRIMARY KEY(按此顺序)。items(StoreName, ItemId)

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

于 2010-01-15T18:56:17.980 回答
1

是的,您确实应该有索引,但它们应该适合您的所有查询。如果没有对您的数据库进行很好的搜索,就很难准确地推荐要配置的索引。

900 万行足以让索引产生很大的不同——但不会大到你不能修改一点。

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

C。

于 2010-01-16T00:21:34.913 回答
0

索引很棒——当以正确的形式使用时。请记住,索引必须被索引。

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

正确使用索引非常有用,但索引并不是万能的问题。即使是正确索引的表也可能因错误的查询和手腕的轻弹而陷入困境。

于 2010-01-15T19:01:05.163 回答