我有一个包含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 | |
+--------------------+------------------------------+------+-----+---------+-------+
答案 0 :(得分:4)
您应该在WHERE
子句中的前导表以及WHERE
和JOIN
子句中的驱动表中索引将要搜索的所有字段。
使索引覆盖查询中使用的所有字段(包括SELECT
和ORDER BY
子句)也会有所帮助,因为不需要查找表。
只需在此处发布您的查询,我就可以告诉您如何索引表格。
<强>更新强>
您的查询最多会返回1
行1
作为COUNT(*)
这将选择具有给定StoreID
(即PRIMARY KEY
)的促销,并加入促销itemId
和StoreName
的商品(此组合为也是PRIMARY KEY
。
此连接成功(返回1
行)或失败(不返回任何行)。
如果成功,COUNT(*)
将为1
。
如果它真的是你想要的,那么你的表被编入索引。
但是,在我看来,您的表格设计稍微复杂一些,而且在复制字段定义时您只是错过了一些字段。
更新2:
在sales (storeId, itemId)
确保PRIMARY KEY
上的items
被定义为(StoreName, ItemId)
(按此顺序)。
如果PK
定义为(ItemID, StoreName)
,则在items (StoreName, ItemID)
上创建索引。
答案 1 :(得分:1)
是的,你真的应该有索引,但它们应该适合你的所有查询。如果没有在您的数据库中进行良好的翻译,很难准确地建议要配置哪些索引。
9百万行足以让索引产生很大的不同 - 但不是那么大,以至于你无法承受修补。
原始解决方案是在商品(storeid),商品(itemid,商店名称),商品(商品名,商品ID),销售商品(商品ID),销售商品(商品ID),商品(商品ID,商品)和销售额(&)上创建索引storeid,itemid)然后删除未使用的索引。
下进行。
答案 2 :(得分:0)
索引很棒 - 以正确的形式使用时。请记住,索引必须编入索引。
将索引集中在主要密钥,共享密钥以及需要繁重和通用数据比较的字段上,例如文字字段和日期范围。
正确使用索引很棒,但索引不是万能的问题。即使是正确编制索引的表格也会因为查询错误和手腕轻弹而瘫痪。