何时在连接表上添加索引

时间:2010-01-15 18:54:15

标签: mysql select join indexing where

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

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

选择子句中的字段怎么样?我应该为所有字段创建一个索引,还是为每个字段创建一个索引?

更新 - 添加了表格和查询

以下是查询 - 我需要根据商店名称和商店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    |       |
+--------------------+------------------------------+------+-----+---------+-------+

3 个答案:

答案 0 :(得分:4)

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

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

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

<强>更新

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

这将选择具有给定StoreID(即PRIMARY KEY)的促销,并加入促销itemIdStoreName的商品(此组合为也是PRIMARY KEY

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

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

如果它真的是你想要的,那么你的表被编入索引。

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

更新2:

  1. sales (storeId, itemId)

  2. 上创建综合索引
  3. 确保PRIMARY KEY上的items被定义为(StoreName, ItemId)(按此顺序)。

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

答案 1 :(得分:1)

是的,你真的应该有索引,但它们应该适合你的所有查询。如果没有在您的数据库中进行良好的翻译,很难准确地建议要配置哪些索引。

9百万行足以让索引产生很大的不同 - 但不是那么大,以至于你无法承受修补。

原始解决方案是在商品(storeid),商品(itemid,商店名称),商品(商品名,商品ID),销售商品(商品ID),销售商品(商品ID),商品(商品ID,商品)和销售额(&)上创建索引storeid,itemid)然后删除未使用的索引。

下进行。

答案 2 :(得分:0)

索引很棒 - 以正确的形式使用时。请记住,索引必须编入索引。

将索引集中在主要密钥,共享密钥以及需要繁重和通用数据比较的字段上,例如文字字段和日期范围。

正确使用索引很棒,但索引不是万能的问题。即使是正确编制索引的表格也会因为查询错误和手腕轻弹而瘫痪。

相关问题