MySQL前缀索引引起的慢查询分析与总结
前端时间与数据库关联的,艾伦·C·反馈查询,使用指数没有使用次数比指数慢,有点毁三观,跟进,与解释,看看2种不同的查询结果。结果如下:当没有索引的查询如下,速度比较块在实际查询中。
复制代码代码如下所示:
MySQL >解释选择*从rosterusers极限10000,3;
+ -- + + + + ------------- ------------- ------ --------------- + ------ + --------- + ------ --------- ------- + + +
我select_type表| | | |型possible_keys关键key_len | | | | REF |行|额外|
+ -- + + + + ------------- ------------- ------ --------------- + ------ + --------- + ------ --------- ------- + + +
| 1 |简单| rosterusers |所有|零零零零| | | | 2010066 | |
+ -- + + + + ------------- ------------- ------ --------------- + ------ + --------- + ------ --------- ------- + + +
使用索引顺序的查询结果如下,速度出奇地慢。
>解释MySQL SELECT * FROM通过用户名限制为rosterusers 10000,3;
+ -- + + + + ------------- ------------- ------ --------------- + ------ + --------- + ------ --------- ---------------- + + +
我select_type表| | | |型possible_keys关键key_len | | | | REF |行|额外|
+ -- + + + + ------------- ------------- ------ --------------- + ------ + --------- + ------ --------- ---------------- + + +
| 1 |简单| rosterusers |所有|零零零零| | | | 2010087 |使用filesort |
+ -- + + + + ------------- ------------- ------ --------------- + ------ + --------- + ------ --------- ---------------- + + +
不同的是,额外使用索引的查询时,使用filesort。外部文件的使用来解决这些问题。这当然是缓慢的。
但在数据表中的用户名,这的确是索引。怎么能用filesort
看看数据表的定义,它是一个开源的聊天服务器,表Ejabberd。首先想到的是关键i_rosteru_user_jid用户名,综合指数和孩子,然后使用以用户名应该用指数吗
复制代码代码如下所示:
创建表(` rosterusers `
`用户名` varchar(250)不为空,
` JID ` varchar(250)不为空,
独特的关键` i_rosteru_user_jid `(`用户名`(75),` JID `(75)),
关键` i_rosteru_jid `(` JID `)
InnoDB引擎=默认的字符集utf8);
经过仔细检查后,突然发现主键的定义不是完整的主键名称,而是有75个长度的描述,它有点心不在焉。它利用前缀索引而不是整个领域。(在我的记忆中,InnoDB不支持这件事吗。据估计是在4之后添加的版本。前缀索引是索引数据字段中n个字节作为索引的一种方法。
在发现这个问题之后,我们开始怀疑慢查询与这个索引有关。前缀索引的主要用途是有时处理字段,而MySQL支持的许多索引长度是有限的。
首先通过限制查询订单,自然还可以和主键相关,因为MySQL InnoDB是依赖于主键的实际操作(即使你是不成立的,系统会有一个默认的),和查询的限制,使用主键可以迅速补充说,(解释返回行,它应该是一个参考值),虽然我没有看到什么文件明确提出这个问题,但返回的结果与顺序不限查询可以证明。
但当我们使用的用户名,我们想要使用的用户名排序而不是用户名(75)排序,但实际指数是前缀索引,不完整的字段的索引,而不是使用索引的时间顺序的。(我添加到SQL语句中的指数i_rosteru_user_jid的强制使用,它不工作)。事实上,表中的字段名称不使用甚至75,和定义的长度是250。这是你造成的麻烦。因为这是其他产品的形式,我们不能改变的,随着时间的推移,我们可以只注重对时间的一种查询查询。
总结:
前缀索引并不是万灵药,它帮助我们索引一个写得太长的字段,但它也导致按顺序排列,由不能由前缀索引的查询组成。
在任何时候,首先要合理规划字段的长度和DB模式定义的字段类型。