我有一个包含900万条记录的mysql表,没有设置任何索引.我需要将其连接到基于公共ID的另一个表.我将为该ID添加一个索引,但select和where子句中还有其他字段.
我应该在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 | |
+--------------------+------------------------------+------+-----+---------+-------+
解决方法:
您应该索引将在WHERE子句的主导表以及WHERE和JOIN子句的从动表中搜索的所有字段.
使索引覆盖查询中使用的所有字段(包括SELECT和ORDER BY子句)也将有所帮助,因为不需要表查找.
只需在此处发布您的查询,我大概就能告诉您如何对表建立索引.
更新:
您的查询最多返回1行,其中1作为COUNT(*)
这将选择具有给定StoreID(即PRIMARY KEY)的销售,并加入销售的itemId和给定StoreName上的商品(此组合也是PRIMARY KEY).
此连接成功(返回1行)或失败(不返回行).
如果成功,则COUNT(*)将为1.
如果这确实是您想要的,则可以对表建立索引.
但是,在我看来,您的表设计要复杂一些,并且在复制字段定义时只是错过了一些字段.
更新2:
>创建销售的综合索引(storeId,itemId)
>确保将项目的主键定义为(StoreName,ItemId)(按此顺序).
如果PK定义为(ItemID,StoreName),则在项目(StoreName,ItemID)上创建索引.