3 回答
TA贡献1801条经验 获得超16个赞
查阅诸如“ 更多地掌握索引艺术”之类的演示。
更新12/2012:我已经发布了我的新演示文稿:《如何设计索引,真的》。我在2012年10月在圣塔克拉拉的ZendCon和2012年12月在伦敦Percona Live上提出了这一点。
设计最佳索引是一个必须与您在应用程序中运行的查询相匹配的过程。
很难建议任何通用规则,这些规则关于哪些列最适合索引,或者是否应该索引所有列,不索引任何列,哪些索引应该跨越多列等等,这取决于您需要运行的查询。
是的,有一些开销,所以您不应不必要地创建索引。但是您应该创建索引,以使您需要快速运行的查询受益。索引的开销通常远远超过其好处。
对于VARCHAR(2500)列,您可能要使用FULLTEXT索引或前缀索引:
CREATE INDEX i ON SomeTable(longVarchar(100));
请注意,如果您正在搜索可能位于该长varchar中间的单词,常规索引将无济于事。为此,请使用全文索引。
TA贡献1844条经验 获得超8个赞
我不会在其他答案中重复一些好的建议,但会补充:
复合指数
您可以创建复合索引-包含多个列的索引。MySQL能够从使用这些留下来的权利。因此,如果您有:
Table A
Id
Name
Category
Age
Description
如果您的复合索引按该顺序包括Name / Category / Age,则这些WHERE子句将使用索引:
WHERE Name='Eric' and Category='A'
WHERE Name='Eric' and Category='A' and Age > 18
但
WHERE Category='A' and Age > 18
不会使用该索引,因为必须从左到右使用所有内容。
说明
使用Explain / Explain Extended可以了解MySQL可以使用哪些索引,以及它实际选择的索引。 MySQL 每个查询只使用一个键。
EXPLAIN EXTENDED SELECT * from Table WHERE Something='ABC'
慢查询日志
打开慢速查询日志以查看哪些查询运行缓慢。
宽列
如果您有一列很宽的列,其中大多数区别出现在前几个字符中,则只能使用索引中的前N个字符。示例:我们有一个ReferenceNumber列定义为varchar(255),但在97%的情况下,引用数为10个字符或更少。我将索引更改为仅查看前10个字符,并显着提高了性能。
添加回答
举报