不对所有列进行索引时的MySQL优化

时间:2012-07-27 06:00:19

标签: mysql sql optimization innodb

假设我有一个包含3列和数千条记录的表:

id # primary key
name # indexed
gender # not indexed

我想找到“所有男性名为亚历克斯”,即具体名称和特定性别。

这里的naieve方式(select * from people where name='alex' and gender=2)是否足够好?或者是否有更优化的方式,如名称上的子查询?

3 个答案:

答案 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子句可以将它用于名称和性别。