我有一个包含900万条记录的mysql表,它没有设置任何索引。我需要根据公共ID将其加入到另一个表中。我要添加一个索引到这个ID,但我也有其他字段在选择和其中子句。什么时候在已连接的表上添加索引
我应该添加一个索引到其中子句中的所有字段吗?
选择子句中的字段?我应该为所有字段创建一个索引还是为每个字段创建一个索引?
更新 - 增加了表格和查询
下面是该查询 - 我需要在项目基础上,商店名称和店铺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姓氏LIKE '%史密斯%''或'WHERE SUBSTRING(ID,2,1)将不利于=“2''从索引的所有。 – RedFilter 2010-01-15 18:59:36
鉴于缺乏信息,很难给出更具体的答案。但即使有这些条件,查询仍然可以从索引中受益。如果表格记录很大,则可以使用完整索引扫描来搜索记录,而不是全表扫描。但是MySQL不支持后期查找,因此可能需要重写查询。 – Quassnoi 2010-01-15 19:11:54
'@ Orbman':第一个查询,假设'Smith'是大写的,将受益于'FULLTEXT'索引,被重写为'MATCH(LastName)AGAINST('+ Smith *'IN BOOLEAN MODE)'。当然,这将在'McSmiths'和类似的姓氏上失败:) – Quassnoi 2010-01-15 19:15:57