ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2019-10-24 08:18:15  阅读:173  来源: 互联网

标签:indexing join select where 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)上创建索引.

标签:indexing,join,select,where,mysql
来源: https://codeday.me/bug/20191024/1919226.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有