假设我有一个包含 3 列和数千条记录的表,如下所示:
id # primary key
name # indexed
gender # not indexed
我想找到“所有叫亚历克斯的男性”,即一个特定的名字和特定的性别。
天真的方式 ( select * from people where name='alex' and gender=2
) 在这里是否足够好?或者有没有更优化的方法,比如名字的子查询?
假设我有一个包含 3 列和数千条记录的表,如下所示:
id # primary key
name # indexed
gender # not indexed
我想找到“所有叫亚历克斯的男性”,即一个特定的名字和特定的性别。
天真的方式 ( select * from people where name='alex' and gender=2
) 在这里是否足够好?或者有没有更优化的方法,比如名字的子查询?
如果创建索引不是一种选择,或者表中有大量数据(或者即使有索引,但您仍想加快步伐),则根据重新排序表通常会产生很大影响到您组合在一起的数据。
我有一个查询要为我的部门汇总 KPI,即使所有内容都已很好地索引,被提取的数据仍在搜索几张表。这意味着在查询将所有正确的行聚合在一起时会访问大量磁盘。我使用重新排序表alter table tableName order by column1, column2;
,查询从大约 15 秒到在 3 秒内返回数据。因此,数据的物理收集可能会产生重大影响 - 即使表已编入索引并且数据库确切知道从哪里获取它。安排数据以便数据库更容易获得所需的一切将提高性能。
假设你没有数千条记录,匹配名字,只有少数是真正的男性,索引就name
足够了。一般来说,您不应该索引具有很少carinality 的字段(只有2 个可能的值意味着您将匹配50% 的行,这不证明使用索引是合理的)。
我能想到的唯一有用的例外是,如果您只选择姓名和性别,并且如果将它们都放入索引中,则可以执行index-covered query
,这比按索引选择行然后从桌子。
一个更好的方法是有一个复合索引。
IE
CREATE INDEX <some name for the index> ON <table name> (name, gender)
然后WHERE
子句可以将它用于名称和性别。