SQL优化MySQL版-分析explainSQL执⾏计划与Type级别详解type索引类型、类型
索引类型type
我们可以清楚的看到type那⼀栏有index ALL eq_ref,他们都代表什么意思呢?
⾸先类型有许多,这⾥我只给⼤家介绍企业⾥⾯⽤的最多的类型:
system>const>eq_ref>ref>range>index>ALL
越往左边,性能越⾼,⽐如system就⽐ALL类型性能要⾼出许多,其中system、const只是理想类型,基本达不到;
我们⾃⼰实际能优化到ref>range这两个类型,就是你⾃⼰写SQL,如果你没优化基本上就是ALL,如果你优化了,那就尽量达到
ref>range这两个级别;
这⾥我强调⼀下,左边基本达不到!
所以,要对type优化的前提是,你需要有索引,如果你连索引都没有创建,那你就不⽤优化了,肯定是;
Type级别详解
⼀.system级别vb怎么连接access数据库
索引类型能是system的只有两种情况:
1.只有⼀条数据的系统表
只有⼀条数据的系统表,就是系统⾥⾃带⼀张表,并且这个表就⼀条数据,这个基本上就达不到,这个是系统⾃带的表,⽽且就⼀条数据,所以基本达不到;
2.或衍⽣表只能有⼀条数据的主查询
这个是可以实现的,但是在实际开发当中,你不可能去写⼀个这么个玩意⼉,不可能公司的业务去让你把SQL索引类型写实
SQL语句:select * From (select * From test01) t where tid = 1;//前⾯需要加explain
执⾏结果:
就是把它凑出来即可;
我之所以能达到system,是因为我满⾜了它的第⼆个条件;
⼆.const级别
const条件稍微低⼀点,但是基本上也达不到;
1.仅仅能查出⼀条的SQL语句并且⽤于Primary key 或 unique索引;
这个我就不说了把,都知道,所以在企业⾥根本不可能实现,能查出来⼀条SQL语句,你的索引还必须是Primary key或unique;
但是我们可以把它凑出来,我再强调⼀点,在公司,你们的业务不可能去让你凑type级别!
SQL语句:select * tid From test01 where tid = 1;//前⾯需要加explain
mysql面试题sql优化执⾏结果:
根据tid,因为tid是我设置的主键,主键就是Primary key,并且只能有⼀条数据,我表⾥⾯本来就⼀条,所以我满⾜了;
三.eq_ref级别
唯⼀性索引:对于每个索引键的查询,返回匹配唯⼀⾏数据(有且只有1个,不能多,不能0);
解说:⽐如你select ...from ⼀张表 where ⽐⽅说有⼀个字段 name = ⼀个东西,也就是我们以name作为索引,假设我之前给name加了⼀个索引值,我现在根据name去查,查完后有20条数据,我就必须保证这⼆⼗条数据每⾏都是唯⼀的,不能重复不能为空!
合法的字符串常量怎么判断只要满⾜以上条件,你就能达到eq_ref,当然前提是你要给name建索引,如果name连索引都没,那你肯定达不到eq_ref;
此种情况常见于唯⼀索引和主键索引;
eclipse安装教程win10⽐如我根据name去查,但是⼀个公司⾥⾯或⼀个学校⾥⾯叫name的可能不⽌⼀个,⼀般你想⽤这个的时候,就要确保你这个字段是唯⼀的,id就可以,你可以重复两个张三,但是你⾝份证肯定不会重复;
添加唯⼀键语法:alter table 表名 add constraint 索引名 unique index(列名)
检查字段是否唯⼀键:show index form 表名;被展⽰出来的皆是有唯⼀约束的;
以上级别,均是可遇不可求
四 .ref级别
到ref还是问题不⼤的,只要你上点⼼,就可以达到;
⾮唯⼀性索引:对于每个索引键的查询,返回匹配的所有⾏(可以是0,或多个)
假设我现在要根据name查询,⾸先name可能有多个,因为⼀个公司或学校叫⼩明的不⽌⼀个⼈,但是你要⽤name去查,你必须name是索引,我们先给它加个索引,因为要达到ref级别,所以这⾥我给它加⼀个单值索引,关于单值索引的介绍我在前⼏篇⽂章讲过:
单值索引语法:alter table 表名 索引类型 索引名(字段)
现在我们根据索引来查数据,这⾥我假设我写的单值索引;
alter table student add index index_name (name);
这个时候我们再去编写sql语句:
alter table student add index index_name (name);
因为name是索引列,这⾥假设有两个叫张三的,ref级别规则就是能查出多个或0个,很显然能查出来多个,那这条SQL语句,必然是ref 级别!
执⾏结果:
数据:
五.range级别
检索指定范围的⾏,查⼀个范围内的数据,where后⾯是⼀个范围查询 (between,in,> < >=);
注:in 有时会失效,导致为ALL;
现在我们写⼀个查询语句,前提是,tid⼀定是⼀个索引列,如果是id的话,就⽤主键索引,也就是唯⼀索引,值不可以重复,这个时候我们范围查询的时候要⽤它来做条件:
EXPLAIN SELECT t.* FROM student t WHERE t.tid BETWEEN 1 AND 2; ;//查询tid是1到2;
查看执⾏结果:
我表⽰,我在这试了好⼏次都是index级别,我也不知道为什么,我即便满⾜条件仍是index级别,可能是数据库版本?html设置文本框大小尺寸
六.index级别
查询全部索引中的数据
fclose怎么读讲解:假设我有⼀张表,⾥⾯有id name age,这个时候name是⼀个单值索引,⼀旦name被设定成索引,它就会成为B树⼀样,经过各种算法将name⾥⾯的值像树⼀样进⾏分类,这个时候我where name = **,就相当于把这颗B树查了⼀个遍,
也就是说,你把name这⼀列给查了⼀遍;
SQL语句:select id From student;//我只查被索引声明的列,必然就是index了;
执⾏结果:
七.ALL级别
查询全部表数据,就是select name From student;
其中 name 不是索引;
如果你查的这⼀列不是索引,就会导致全表扫描,所以要避免全表扫描;执⾏结果:
【转载请注明出处和署名,谢谢!】
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论