我有一个包含以下结构的表和一个频繁查询的列表。只查看索引,表的推荐索引结构是什么,可以提供最佳性能?该表有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=?
答案 0 :(得分:1)
如果tenantId
是外键(其名称暗示是),则它是索引的明显选择:
create index mytable_tenantId_index on mytable(tenantId);
对于租户(超过十几个)有合理的金额,您会发现这个指数会带来很大的性能提升。租户越多,改善程度越大。
这个索引已经足够了,因为您只需在tenantId
上应用条件就可以大幅减少行数。此外,您的查询条件没有tenantId
为null
的条件,因此您不必为此边缘案例提供服务。
答案 1 :(得分:0)
索引是在空间和性能之间进行权衡的问题 - 当然索引在查询中使用的所有列都是最有效的,但是,索引将占用服务器上更多的空间。从查询的外观来看,您显然需要索引tenantId,并且可能应该对dateDeleted进行索引。如果指定tenantId会显着减小结果集的大小,则对其余列的顺序扫描可能会正常执行。同样,这是空间与性能的关系,以及数据集的细节。
答案 2 :(得分:0)
与what slessans said类似:添加索引可提高SELECT
次查询的速度,但会降低其查询速度INSERT
(因为索引应该在添加新行时重新计算),所以你应该找到这两者之间的平衡。
好的做法是对JOIN
和WHERE
子句中经常出现的列进行索引,但请记住,对具有大量NULL
值的列建立索引并不合理。对包含非常有限数量的不同值(例如性别)的列建立索引。
我希望这会有所帮助......