性能的最佳索引结构

时间:2015-06-28 23:29:46

标签: mysql indexing

我有一个包含以下结构的表和一个频繁查询的列表。只查看索引,表的推荐索引结构是什么,可以提供最佳性能?该表有200多万行。

Table Structure:
id int(10) unsigned not_null auto_increment
dateDeleted datetime null
tenantId int(10) unsigned not_null
userId int(10) unsigned default 0
status tinyint(3) unsigned default 0
priority tinyint(3) unsigned default 0
docnum varchar(20) not_null

Frequent Queries:
where tenantId=? and dateDeleted is null;
where tenantId=? and dateDeleted is null and docnum=?
where tenantId=? and dateDeleted is null and status=?
where tenantId=? and dateDeleted is null and priority=?
where tenantId=? and dateDeleted is null and userId=?
where tenantId=? and dateDeleted is null and status=? and priority=?
where tenantId=? and dateDeleted is null and status=? and priority=? and userId=?
where tenantId=? and dateDeleted is null and status=? and userId=?
where tenantId=? and dateDeleted is null and priority=? and userId=?

3 个答案:

答案 0 :(得分:1)

如果tenantId是外键(其名称暗示是),则它是索引的明显选择:

create index mytable_tenantId_index on mytable(tenantId);

对于租户(超过十几个)有合理的金额,您会发现这个指数会带来很大的性能提升。租户越多,改善程度越大。

这个索引已经足够了,因为您只需在tenantId上应用条件就可以大幅减少行数。此外,您的查询条件没有tenantIdnull的条件,因此您不必为此边缘案例提供服务。

答案 1 :(得分:0)

索引是在空间和性能之间进行权衡的问题 - 当然索引在查询中使用的所有列都是最有效的,但是,索引将占用服务器上更多的空间。从查询的外观来看,您显然需要索引tenantId,并且可能应该对dateDeleted进行索引。如果指定tenantId会显着减小结果集的大小,则对其余列的顺序扫描可能会正常执行。同样,这是空间与性能的关系,以及数据集的细节。

答案 2 :(得分:0)

what slessans said类似:添加索引可提高SELECT次查询的速度,但会降低其查询速度INSERT(因为索引应该在添加新行时重新计算),所以你应该找到这两者之间的平衡。
好的做法是对JOINWHERE子句中经常出现的列进行索引,但请记住,对具有大量NULL值的列建立索引并不合理。对包含非常有限数量的不同值(例如性别)的列建立索引。

我希望这会有所帮助......