mysql-何时在联接表上添加索引

我有一个包含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)上创建索引.

上一篇:mysql-3个字段的索引是否可用于2个字段查询?


下一篇:python-Google App Engine-跟踪使用了哪些索引