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