zoukankan      html  css  js  c++  java
  • 索引

    索引
    什么是索引
    索引是一种,单独的,物理层面的数据结果,其作用是用于加速查询
    为什么需要索引
    mysql把数据库存储到硬盘中,硬盘读写速度非常慢
    一个应用程序,本质上就是再对数据进行增删改查
    一旦数据量比较大时,硬盘的响应变慢,给用户的感觉应用程序非常的慢
    查询操作时应用程序使用中频率最高的操作
    索引最终目的就是要提升查询的速度,因为对数据库的修改频率低

    索引带来的问题
    1.添加索引后,整体的数据更大了(占用额外的磁盘空间)
    2.由于有了索引,多数数据的添加修改删除,都会引发索引的重建(效率降低)
    误区:
    索引不是越多越好
    索引的实现:
    查询之所以慢的原因,数据量大是一个问题
    最核心的问题就是硬盘的IO速度问题
    mysql通过B+树结构来组织数据

    由于硬盘设计原理 导致每一次读取数据 必须花费9ms时间来查找地址
    9ms是固定的没有办法降低 只能想办法降低io次数来提高速度

    操作有一个预读的优化机制
    比如你要读取地址为10的数据操作系统会把相邻的数据也读到内存来减少读取次数
    mysql通过B+树这种结构来减少次数
    B+树中每一个磁盘块有两个数据项 一个 三个地址 在查询时 会比叫大小
    如果小于左边 就访问p1 地址 如果大于右边 就访问p3的地址 否则就访问中间p2的地址
    与二分法原理相同 只不过 每次把数据分成三段
    树的结构越低越好 所以建议把数量小的作为索引来降低高度

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

    辅助索引
    除了主键索引之外的所有的索引都是辅助索引
    辅助索引会单独创建树结构,其中存储索引数据本身以及改数据对应主键值
    查询过程中出现的情况
    覆盖索引:是在当前树结构中就拿到了所有需要的数据
    回表:是在辅助索引中没有查询到需要的数 就需要拿着id回到主键索引中查找

    查询速度
    主键>覆盖索引>回表
    编写sql时 如果有主键值先优先使用主键来查询
    如果没有主键值需要用辅助索引 这个时候尽量少查字段 最好保证需要的数据就在辅助索引中
    避免select*
    索引的优化分为两方面
    1.索引结构的优化
    数据量小的
    重复度低的
    2.sql语句的优化
    sql语句中条件应该是索引字段
    避免在模糊匹配中在最前面使用% 需要全表扫描
    ==>select count(*) from user where name like '%sasaad';
    不要在主键进行运算 例如 where id *10=100;
    先算出具体的值再来查询 where id=100/10';
    3.and 和 or
    在and语句中mysql会优先查询带有索引的字段 无论书写位置在前还是在后
    name 有索引但是重复度高id没有索引 email 有 会跳过id直接查email
    ==>select count(*) from user where name = 'jack' and id = 1 and email = 'xxx';
    and语句没有优化的余地
    or语句中不会自动选择有索引的 是依次执行 无论是否条件成立 都查一遍
    所有一定避免使用or语句

    or语句的优化
    select * from user where name = '张三' or name = '李四';

    select * from user where name in ('张三','李四');

    select * from user where name = '张三'
    union
    select * from user where name = '李四';
    4.多字段联合索引
    如果要查询的字段较多 如果每一个字段都创建索引
    会造成额外的容量的占用并且当你修改一条记录时 有可能所有索引都需要重建会非常慢
    顺序是重点 把重复低的字段放在最左边 依次排开
    create index all_index on user(email,name,gender);
    编写sql时 保证重复度低的字段出现在sql语句中即可
    创建索引的语法
      create index 索引的名字 on 表名(字段);
    删除索引
      drop index 索引名字 on 表名;











  • 相关阅读:
    Nbimer族助手 部分控件不能用的解决方法(转)
    jquery中通过全局变量来禁止多次ajax请求
    Three.JS 从世界坐标系转换到屏幕坐标系
    php 判断是手机版还是电脑端
    6个html5页面适配iphone6的技巧
    http://stackoverflow.com/questions/6065169/requestanimationframe-with-this-keyword
    javascript模仿php 函数 trim ltrim rtrim (原创)
    JavaScript中Trim(),TrimStart(),TrimEnd()的实现
    如何定位摄像机,使物体在屏幕上始终具有相同的像素宽度和高度?(threes)
    鸿基台式机安装
  • 原文地址:https://www.cnblogs.com/ShenJunHui6/p/10573705.html
Copyright © 2011-2022 走看看