zoukankan      html  css  js  c++  java
  • mysql的索引内容

    1.索引的作用主要是加速查找

    2.索引的的分类有几类分别为主键索引,唯一索引,普通索引和联合索引

    主键索引:主要是主键的作用,主键不能为空且不能重复,最后有加速查找的功能

    唯一索引:它分为两部分,一个是唯一约束,一个是索引,

    普通索引:它就是加速查找,对数据没有什么要求,

    联合索引:把多列组合成一个整体,当作一个索引,一般情况下都是联合主键,联合唯一和联合普通索引(把多列组合在一起设置它们为一个普通索引,叫联合普通索引)

    3.索引能加速查找的然因是一旦建立索引,它就会自动创建一个额外文件(某种格式存储),然后在进行索引查找时,先在该文件中找到要的信息,然后根据select要显示的内容,在要查询表中寻找信息.而如果没有索引,它会从头到尾依次查找一遍.所以索引能节省时间.但是建立了索引,在对表进行增删改的时候,就有些浪费时间了,因为对表进行操作时,还要对相应的额外文件进行操作.

    4.创建额外文件中的格式存储方式分为hash索引和btree索引.默认是btree索引的型式存储的.

    hash索引:它一般在单值查询的时候很快,在范围查询的时候很慢,原因是hash索引是无序的.hash索引的存储结构是有两列,一列放hash值,一列放该hash对于表中索引值所在的存储位置(或是存储路径)

    btree索引:它是以二叉树结构存储的数据结构.如下图

    1. 索引的建立和删除:

    建立索引: 形如  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  表名   删除唯一索引

    1. 索引中的两个索引名称:覆盖索引和索引合并.

    覆盖索引:在索引文件中直接获取数据,即select  的和通过索引查询的是同样的内容

    Select  id   from userinfo3  where  id >3000;

    索引合并:指的是把多个索引联合起来进行查找,如下,其中name是索引,email也是索引.select   * from userinfo3 where  name=’alex’   and email=’alex11@qq.com’

    注:联合索引的效率>索引合并的

    1. 对应要进行频繁查找的列,应该建立索引,然后进行索引查询.在进行索引查询时,只有命中索引才能进行索引查询.有以下几种情况是不能命中索引的
      1. Like  ‘%xx’  模糊匹配不能进行索引查询,我们应该导入第三方模块进行
      2. 使用函数,在where条件中对索引列进行使用函数,也不能进行索引查询
      3. 有or  的情况 如  select * from   t1   where   id  =1 or  name =’alex’  name不是索引,所以不能进行索引查找
      4. 类型不一致,如列是字符串类型,但是判断条件的值不是字符串类型,也不能进行索引查询
      5. !=   在条件判断中出现!=时,不走索引,但是主键例外
      6. >或<  在条件判断中出现<或>时,也不走索引,但是当主键或索引是整数类型时,可以走索引
      7. Order   by  一般情况下出现order  by的时候不走索引,但是当对索引排序时进行索引覆盖走索引,如果是对主键排序,则走索引
      8. 联合索引(组合索引)最左前缀

    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)mysqlmysql-5.7.16-winx64my-default.ini’  

    ’ D:Program Files(x86)mysqlmysql-5.7.16-winx64my-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

    1. 页面只有上一页,下一页

    #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行

    1. 上一页   193  194  195  [196]   197  198   199   下一页,当前页码是196,如果选择199页码,则sql语句是:

           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)

    参考链接

    http://www.cnblogs.com/wupeiqi/articles/5716963.html

  • 相关阅读:
    HDU 5710 digit sum
    Fibonacci Tree HDU
    2016CCPC东北赛补题
    紫书水题
    20180415校赛
    随心所欲小游戏
    Alpha版本测试报告
    第四天作业
    第二天作业
    第一天作业
  • 原文地址:https://www.cnblogs.com/IQ-Python/p/6994864.html
Copyright © 2011-2022 走看看