2

假设我有一个包含 3 列和数千条记录的表,如下所示:

id # primary key
name # indexed
gender # not indexed

我想找到“所有叫亚历克斯的男性”,即一个特定的名字和特定的性别。

天真的方式 ( select * from people where name='alex' and gender=2) 在这里是否足够好?或者有没有更优化的方法,比如名字的子查询?

4

3 回答 3

1

如果创建索引不是一种选择,或者表中有大量数据(或者即使有索引,但您仍想加快步伐),则根据重新排序表通常会产生很大影响到您组合在一起的数据。

我有一个查询要为我的部门汇总 KPI,即使所有内容都已很好地索引,被提取的数据仍在搜索几张表。这意味着在查询将所有正确的行聚合在一起时会访问大量磁盘。我使用重新排序表alter table tableName order by column1, column2;,查询从大约 15 秒到在 3 秒内返回数据。因此,数据的物理收集可能会产生重大影响 - 即使表已编入索引并且数据库确切知道从哪里获取它。安排数据以便数据库更容易获得所需的一切将提高性能。

于 2012-07-27T08:00:50.547 回答
1

假设你没有数千条记录,匹配​​名字,只有少数是真正的男性,索引就name足够了。一般来说,您不应该索引具有很少carinality 的字段(只有2 个可能的值意味着您将匹配50% 的行,这不证明使用索引是合理的)。

我能想到的唯一有用的例外是,如果您只选择姓名和性别,并且如果将它们都放入索引中,则可以执行index-covered query,这比按索引选择行然后从桌子。

于 2012-08-13T16:30:21.607 回答
0

一个更好的方法是有一个复合索引。

IE

CREATE INDEX <some name for the index> ON <table name> (name, gender)

然后WHERE子句可以将它用于名称和性别。

于 2012-07-27T06:11:13.187 回答