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

  • 相关阅读:
    第36课 经典问题解析三
    第35课 函数对象分析
    67. Add Binary
    66. Plus One
    58. Length of Last Word
    53. Maximum Subarray
    38. Count and Say
    35. Search Insert Position
    28. Implement strStr()
    27. Remove Element
  • 原文地址:https://www.cnblogs.com/IQ-Python/p/6994864.html
Copyright © 2011-2022 走看看