MySQL对索引的定义:索引index是帮助MySQL高效获取数据的数据结构;

    1. 全表扫描:会将整张表全部扫描一遍,这样的话非常低;
    2. mysql支持Hash,平衡二叉树,B树,B+树;最牛的是B+树;
    3. Hash索引:<br /> 优点:通过字段的值计算的hash值,定位数据非常快;<br /> 缺点:不支持范围查询,因为底层数据结构是散列的,无法进行比较大小;
    4. 平衡二叉树:<br /> 优点:查询效率还可以;<br /> 缺点:虽然支持范围查询,但是回旋查询效率低;
    5. B树:<br /> 因为B树节点元素比平衡二叉树要多,所以B树数据结构相比平衡二叉树数据结构实现减少磁盘IO的操作<br /> 查询是比平衡二叉树要快了点,但是范围查询依然比较慢;
    6. B+树<br /> B+树相比B树,新增了叶子结点与非叶子节点的关系,叶子结点包含了keyvalue,非叶子节点中只有key,不包含value;<br /> 所有相邻的叶子结点包含非叶子节点,使用链表进行结合,有一定的顺序排序,从而范围查询效率非常高;
    7. MyISAMInnoDB都是应用B+树来实现的,只是有所不同的是,MyISAMB+树中的叶子结点的value为数据记录的地址,而Innodb中的叶子结点的value是数据记录本身;<br />[全面解密MySQL索引实现原理.pptx](https://www.yuque.com/attachments/yuque/0/2019/pptx/233760/1573028843452-23aed94f-56f7-431d-8e8f-bb05619d6083.pptx?_lake_card=%7B%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2019%2Fpptx%2F233760%2F1573028843452-23aed94f-56f7-431d-8e8f-bb05619d6083.pptx%22%2C%22name%22%3A%22%E5%85%A8%E9%9D%A2%E8%A7%A3%E5%AF%86MySQL%E7%B4%A2%E5%BC%95%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86.pptx%22%2C%22size%22%3A254568259%2C%22type%22%3A%22application%2Fvnd.openxmlformats-officedocument.presentationml.presentation%22%2C%22ext%22%3A%22pptx%22%2C%22source%22%3A%22%22%2C%22status%22%3A%22done%22%2C%22mode%22%3A%22title%22%2C%22download%22%3Atrue%2C%22uid%22%3A%221573028697061-0%22%2C%22progress%22%3A%7B%22percent%22%3A0%7D%2C%22percent%22%3A0%2C%22id%22%3A%22HnJO5%22%2C%22card%22%3A%22file%22%7D)

    1、where 是用于前边的过滤 而having是用于groupby后的过滤,两者可结合使用

    2、索引操作:
    增加一个普通索引:MUL
    alter table tableName add index indexName(fieldName);
    增加一个唯一索引:UNI 唯一且可以为null
    alter table tableName add unique index indexName(fieldName);
    alter ignore ….. 是在表中某个字段已经存在大量相同的值,但是我们依然需要忽略而创建唯一索引;
    创建主键索引:PRI 唯一不允许为null
    create table tableName(id int primary key auto_increment,name varchar(20) not null defalut ‘’);
    alter table tableName add primary key (fieldName);
    复合索引:
    create index indexName on tableName (field1,field2,field3);
    alter table tablename add index indexname (field1,field2,field3)
    怎样删除索引:
    drop index indexname on tablename

    全文索引 参考https://blog.csdn.net/dreamyuzhou/article/details/120432893
    image.png
    image.png

    3、MySQL数据库配置慢查询
    参数说明:
    slow_query_log 慢查询开启状态
    slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录)
    long_query_time 查询超过多少秒才记录
    1.查询慢查询配置
    show variables like ‘slow_query%’;
    2020-12-23_093517.png
    2.查询慢查询限制时间
    show variables like ‘long_query_time’;
    2020-12-23_093604.png
    3.将 slow_query_log 全局变量设置为“ON”状态
    set global slow_query_log=’ON’;
    4.查询超过1秒就记录
    set global long_query_time=1;
    5.查询cat /var/lib/mysql/localhost-slow.log

    4、索引为什么会失效?注意那些事项?
    1.索引无法存储null值 主索引成全表扫描,而普通索引无影响;唯一索引is null 1,is not null 全表
    2.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)
    3.对于多列索引,不是使用的第一部分,则不会使用索引
    4.like查询以%开头,主键索引和唯一索引前后都不可以,普通索引前不可以,后可以;
    5.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
    6.如果mysql估计使用全表扫描要比使用索引快,则不使用索引

    5、复合索引:
    2 EXPLAIN select from user_details WHERE id=1
    1 EXPLAIN select
    from user_details WHERE id=1 and user_name=’yushengjun1’;
    6 select * from user_details WHERE user_name=’yushengjun1’;
    2019-11-06_195259.png
    因为索引底层采用B+树叶子节点顺序排列,必须通过左前缀索引才能定位到具体的节点范围;


    怎样回答数据库索引实现原理:
    第一点说一下、MyISAM与InnoDB都是采用B+树数据结构实现索引的只不过MyISAM的B+树中的叶子节点value存放的时候数据的地址,而InnoDB的B+树中的叶子节点value值存放的是真实的数据;B+树继承了B树的优点,你就查询某个节点较快,因为B树比平衡二叉树多了三节点的模型,每一层的节点变多,所以查询的效率就更快,同时B+树增加了叶子节点与非叶子节点的区别,叶子节点中包含了key和value,叶子节点包含了非叶子节点,都有序的存放在一个队列中,所以当我们按照范围区间来查询的时候比B树要快;

    可视化数据结构:
    https://www.cs.usfca.edu/