为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL索引-最佳做法是什么?

MySQL索引-最佳做法是什么?

白板的微信 2019-11-21 12:56:35
我已经在MySQL数据库上使用索引已有一段时间了,但是从未正确地了解过它们。通常,我会使用WHERE子句在要搜索或选择的任何字段上添加索引,但有时看起来并不那么黑白。MySQL索引的最佳做法是什么?情况/困境示例:如果一个表有六个列,并且所有列都是可搜索的,那么我应该对它们全部编制索引还是不对它们进行索引?。索引对性能的负面影响是什么?。如果我有一个VARCHAR 2500列,可以从我的网站的某些部分进行搜索,我应该对它进行索引吗?
查看完整描述

3 回答

?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

查阅诸如“ 更多地掌握索引艺术”之类的演示。


更新12/2012:我已经发布了我的新演示文稿:《如何设计索引,真的》。我在2012年10月在圣塔克拉拉的ZendCon和2012年12月在伦敦Percona Live上提出了这一点。


设计最佳索引是一个必须与您在应用程序中运行的查询相匹配的过程。


很难建议任何通用规则,这些规则关于哪些列最适合索引,或者是否应该索引所有列,不索引任何列,哪些索引应该跨越多列等等,这取决于您需要运行的查询。


是的,有一些开销,所以您不应不必要地创建索引。但是您应该创建索引,以使您需要快速运行的查询受益。索引的开销通常远远超过其好处。


对于VARCHAR(2500)列,您可能要使用FULLTEXT索引或前缀索引:


CREATE INDEX i ON SomeTable(longVarchar(100));

请注意,如果您正在搜索可能位于该长varchar中间的单词,常规索引将无济于事。为此,请使用全文索引。


查看完整回答
反对 回复 2019-11-21
?
婷婷同学_

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个字符,并显着提高了性能。


查看完整回答
反对 回复 2019-11-21
  • 3 回答
  • 0 关注
  • 365 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信