加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

Java高级编程——MySQL索引实现及优化原理解析

发布时间:2018-08-30 18:10:53 所属栏目:编程 来源:Java高并发框架
导读:技能沙龙 | 邀您于8月25日与国美/AWS/转转三位专家配合切磋小措施电商拭魅战 在MySQL中,索引属于存储引擎级此外面念,差异存储引擎对索引的实现方法是差异的,本文首要接头MyISAM和InnoDB两个存储引擎的索引实现方法。 MyISAM索引实现MyISAM引擎行使B+Tree作

显然这个查询等价于查询emp_no为10001的函数,可是因为查询前提是一个表达式,MySQL无法为其行使索引。看来MySQL还没有智能到自动优化常量表达式的水平,因此在写查询语句时只管停止表达式呈此刻查询中,而是先手工私下代数运算,转换为无表达式的查询语句。索引选择性与前缀索引既然索引可以加速查询速率,那么是不是只要是查询语句必要,就建上索引?谜底是否认的。由于索引固然加速了查询速率,但索引也是有价钱的:索引文件自己要耗损存储空间,同时索引会加重插入、删除和修改记录时的承担,其它,MySQL在运行时也要耗损资源维护索引,因此索引并不是越多越好。一样平常两种环境下不提议建索引。第一种环境是表记录较量少,譬喻一两千条乃至只有几百笔记录的表,没须要建索引,让查询做全表扫描就好了。至于几多笔记录才算多,这个小我私人有小我私人的观点,我小我私人的履历是以2000作为分界限,记录数不高出 2000可以思量不建索引,高出2000条可以酌情思量索引。另一种不提议建索引的环境是索引的选择性较低。所谓索引的选择性(Selectivity),是指不一再的索引值(也叫基数,Cardinality)与表记录数(#T)的比值:Index Selectivity = Cardinality / #T显然选择性的取值范畴为(0, 1],选择性越高的索引代价越大,这是由B+Tree的性子抉择的。譬喻,上文用到的employees.titles表,假如title字段常常被单独查询,是否必要建索引,我们看一下它的选择性:

Java高级编程——MySQL索引实现及优化道理理会

title的选择性不敷0.0001(准确值为0.00001579),以是其实没有什么须要为其单独建索引。有一种与索引选择性有关的索引优化计策叫做前缀索引,就是用列的前缀取代整个列作为索引key,当前缀长度合当令,可以做到既使得前缀索引的选择性靠近全列索引,同时由于索引key变短而镌汰了索引文件的巨细和维护开销。下面以employees.employees表为例先容前缀索引的选择和行使。从图8可以看到employees表只有一个索引<emp_no>,那么假如我们想按名字搜刮一小我私人,就只能全表扫描了:

Java高级编程——MySQL索引实现及优化道理理会图 8

假如频仍按名字搜刮员工,这样显然服从很低,因此我们可以思量建索引。有两种选择,建<first_name>或<first_name, last_name>,看下两个索引的选择性:

Java高级编程——MySQL索引实现及优化道理理会

<first_name>显然选择性太低,<first_name, last_name>选择性很好,可是first_name和last_name加起来长度为30,有没有分身长度和选择性的步伐?可以思量用first_name和last_name的前几个字符成立索引,譬喻<first_name, left(last_name, 3)>,看看其选择性:

Java高级编程——MySQL索引实现及优化道理理会

选择性还不错,但离0.9313照旧有点间隔,那么把last_name前缀加到4:

Java高级编程——MySQL索引实现及优化道理理会

这时选择性已经很抱负了,而这个索引的长度只有18,比<first_name, last_name>短了靠近一半,我们把这个前缀索引 建上:

  1. ALTER TABLE employees.employeesADD INDEX `first_name_last_name4` (first_name, last_name(4)); 

此时再执行一遍按名字查询,较量说明一下与建索引前的功效:

Java高级编程——MySQL索引实现及优化道理理会

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读