zoukankan      html  css  js  c++  java
  • MySQL索引

    索引是什么

    索引就相当于书的目录,是MySQL中的一种专门的数据结构,称之为key。索引的本质原理就是通过不断地缩小查询范围,来降低io系数从而提升查询性能。                               强调:一旦围标创建了索引,以后的查询都会先用索引,在根据索引定位结果去查找数据。

    为什么要用索引

    对于一个应用来说,对数据库的读写比例基本上是10:1,即读多写少 而且对于写来说极少出现性能问题,大多数的性能问题都是慢查询,提到加速查询数据,就必须用到索引                                                                                     MySQL 通过b+ 树这种结构来减少io操作

    b+树中每一个磁盘块 有两个数据项 一共三个地址 在查询时 会比较大小     如果小于左边就访问p1的地址  如果大于右边 就访问p3的地址  否则就访问中间p2的地址  与二分法原理相同,只不过每次都把数据分成三段 

    树的结构越低越好 ,所以建议把数据量小的作为索引,来降低高度

    怎么用索引

    1 在表中有大量的数据的前提下,创建索引速度会变慢

    2 在索引创建完毕后,对表的查询性能会大幅度提升,但是写性能会降低

    04 聚集索引(主键)

    特点:叶子节点存放的一条数据

    主键索引,速度快,因为只要根据ID找到叶子节点,那么该行的所有数据拿到了  innodb需要用主键来建立数据结构,所以每一个表都应该有一个主键

    05辅助索引

    除了主键索引之外的所有的索引都是辅助索引

    辅助索引 回单纯创建树结构,其中存储索引的数据本身以及该数据对应的主键值

    查找过程中肯定出现的情况

    覆盖索引:是在当前树结构中拿到了所有需要的数据

    回表:是在辅助索引中没有查询的数据,就需要拿着主键的ID回到主键索引中查找

    查询速度:

    主键查找 》覆盖索引 》回表查找

    编写sql时 如果没有主键值,优先用主键来查询,如果没有主键值,需要用辅助索引,这时候尽量少查字段,最好保证需要的数据就在辅助索引中  避免select * 

    特点:如果是按照这个字段创建的索引

    那么叶子点存放的就是:{名字:名字所在的那条记录的主键的值}

    索引带来的问题

    eg:800页的数据,可能需要10页的索引

    1 添加索引后,整体的数据更大了 (占用额外的磁盘数据)

    2 由于有了索引,多数据的添加修改删除,都会引发索引的重建(效率降低)

    误区:索引不是越多越好

    索引的优化

    索引的优化 分为两个方面

     一  索引结构的优化

    1 数据量小的

    2 重复度低的作为索引

    二 sql 语句的优化

    sql语句中条件应该是索引字段 

    避免在模糊匹配中 在最前面使用% 需要全表扫描

    eg: select count(*) from usr where name like "%asssas"

    不要对主键进行运算 例如where ID*10 = 100;

    先算出具体的值来查询 where ID =100/10;

    三 and 和or

    在and 语句中MySQL 会优先查询带有索引的字段 无论书写位置在前还是在后  name 有索引但是重复度高 ID么有索引的字段 ,email 有索引 会跳过ID直接查email

    eg:select count(*)from usr where name = "jack" and  id = 1 and email ="xxxx";

    and 语句中么有优化的余地

    or语句中 不会自动选择有索引的 是依次执行,无论是否有条件成立 都查一遍,所以应该避免使用or语句

    or语句的优化

    select * from usr where name = "张三” or name ="李四";

    select * from usr where name in (“张三”,“李四”);

    最终优化

    select * from usr where name = “张三”

    union 

    select * from usrwhere name = “李四”;

    四 多字段联合查询

    如果要查询的字段较多,如果为每一个字段都创建索引会造成额外的容量的占用 ,并且当你修改一条记录时,有可能所有的索引都需要重建,所以会非常慢

    顺序是重点

    create index 索引的名字 on 表名(字段名);

    删除索引 

    drop index 索引名字 on 表名;

  • 相关阅读:
    jquery ajax跨域取数据
    Python编写相关注意事项
    深入理解java.lang.String
    Java设计模式----迭代器模式
    Java设计模式----状态模式
    Java设计模式----观察者模式
    Java设计模式----适配器模式
    Java设计模式----外观模式
    Java设计模式----建造者模式
    Java设计模式----模板方法模式
  • 原文地址:https://www.cnblogs.com/tangda/p/10574060.html
Copyright © 2011-2022 走看看