1.索引的做用主要是加速查找html
2.索引的的分类有几类分别为主键索引,惟一索引,普通索引和联合索引mysql
主键索引:主要是主键的做用,主键不能为空且不能重复,最后有加速查找的功能sql
惟一索引:它分为两部分,一个是惟一约束,一个是索引,数据结构
普通索引:它就是加速查找,对数据没有什么要求,函数
联合索引:把多列组合成一个总体,看成一个索引,通常状况下都是联合主键,联合惟一和联合普通索引(把多列组合在一块儿设置它们为一个普通索引,叫联合普通索引)优化
3.索引能加速查找的然因是一旦创建索引,它就会自动建立一个额外文件(某种格式存储),而后在进行索引查找时,先在该文件中找到要的信息,而后根据select要显示的内容,在要查询表中寻找信息.而若是没有索引,它会从头至尾依次查找一遍.因此索引能节省时间.可是创建了索引,在对表进行增删改的时候,就有些浪费时间了,由于对表进行操做时,还要对相应的额外文件进行操做.日志
4.建立额外文件中的格式存储方式分为hash索引和btree索引.默认是btree索引的型式存储的.htm
hash索引:它通常在单值查询的时候很快,在范围查询的时候很慢,缘由是hash索引是无序的.hash索引的存储结构是有两列,一列放hash值,一列放该hash对于表中索引值所在的存储位置(或是存储路径)blog
btree索引:它是以二叉树结构存储的数据结构.以下图排序
创建索引: 形如 create index 索引名 on 表名A(列名a) 表示给A表的a列创建普通索引.如:Create index ix_name on userinfo3(email) 表示给userinfo3表中的email列创建了普通索引.
若是在index前加unique 就是创建惟一索引,
即create unique index 索引名 on 表名A(列名a) 表示给A表的a列创建惟一索引.
若是在表名A(列名a)的括号内添加多列如(列名a,列名b) 就是联合普通索引,
即 create index 索引名 on 表名A(列名a,列名b) 表示给A 表的a列和b列联合在一块儿创建一个普通索引,即联合普通索引.通常是经过and链接起来这两列进行索引查找的,也能够只经过a列进行索引查找,可是不能只经过b列进行索引查找.这种现象叫最左前缀匹配. 联合索引遵循最左前缀匹配,即只要出现最左边的那一列,就能进行联合索引查找.
如create index ix_name_Email on userinfo3(name,email,age) 给usrinfo3表中的name,email,age等列创建一个联合普通索引,
Select * from userinfo3 where name=’alex’;能进行联合索引
Select * from userinfo3 where name=’alex’ and age=32 ;能进行联合索引
Select * from userinfo3 where email=’alex@qq.com’ ;不能进行联合索引,由于没有name列.
删除索引:drop index 索引名 on 表名 删除普通索引
Drop unique index 索引名 on 表名 删除惟一索引
覆盖索引:在索引文件中直接获取数据,即select 的和经过索引查询的是一样的内容
Select id from userinfo3 where id >3000;
索引合并:指的是把多个索引联合起来进行查找,以下,其中name是索引,email也是索引.select * from userinfo3 where name=’alex’ and email=’alex11@qq.com’
注:联合索引的效率>索引合并的
8.判断是否走索引的方法(通常正确)
经过explain +select语句,explain的做用是预估其后跟的select语句的查询快慢.
All <index<range<index_merge<ref_or_null<ref<eq_ref<system/const
Explain select * from userinfo3 where name=’alex’
Type:ALL(全表扫描,即没走索引)
Type:const(走索引最快,查找的最多有一个匹配行)
Explain 中type =all,表示
Type=const表示
查询结果中主要看id和type,id中的值表示预估的select语句有几个,type中的值表示该select语句是否走了索引,通常状况下,走索引的比没走索引的快
9.经过创建索引,而后命中索引,就能进行select语句的优化,提升查询效率.因此在写查询语句时,对查询的语句经过explain预估该查询语句是否走了索引,而后看看是否犯了没命中索引的8种状况,最后对查询语句进行优化.
10.慢日志查询 ,对于慢日志,要注意三点:1.执行时间>10 2. 未命中索引 3.日志文件路径 在mysql中经过show variables like ‘%query%’ 查询到mysql的当前配置信息,主要看slow_query_log 查看是否开启慢日志记录
Long_query_time 时间限制,查看最长查询时间,一旦超过此时间,则记录
Slow_query_log_file 查看慢日志文件及路径
经过Show variables like ‘%queries%’查询是否记录索引设置信息.
Log_queries_not_using_indexes 是否记录使用索引进行查询的状况
修改当前配置:set global 变量名=值
在配置文件中进行修改(它是在服务端进行的)
Mysqld --defaults-file=’d:\mysql.conf’ 表示按配置文件的内容,启动mysql服务
在mysql.conf中设置配置信息:
Slow_query_log=on
Slow_query_log_file =
Mysqld --defaults-file=’ D:\Program Files(x86)\mysql\mysql-5.7.16-winx64\my-default.ini’
’ D:\Program Files(x86)\mysql\mysql-5.7.16-winx64\my-default.ini’它是mysql服务端的默认配置文件
注意: 修改配置文件以前,要把配置文件进行备份. 修改配置文件以后,须要重启服务,即若是对mysql.conf的内容进行修改了,就要重新运行Mysqld --defaults-file=’d:\mysql.conf’
11.分页 使用limit
1)select * from userinfo3 limit 20,10; 表示从头扫到20行的位置,而后从它开始取10行显示;这种从头开始扫的方式进行分页效率很低
2)分页进行优化的方式有,1.不让看,即有些页码掩藏,2.在索引表中扫
在索引表中扫的a.记录当前页的最大或最小id
#max_id
#min_id
下一页:
Select * from userinfo3 where id>max_id limit 10;表示先定位到id的位置.而后从该位置开始取10行
上一页: select * from userinfo3 where id<min_id order by id desc limit10;表示先定位到id的位置,而后按id倒序排列,在从该位置开始取10行
Select * from userinfo3 where id in(
Select id from (select id from userinfo3 where id>max_id limit30) as n order by n.id desc limit 10)
参考连接