美文网首页
MySQL面试 -- 索引

MySQL面试 -- 索引

作者: 米_8d62 | 来源:发表于2020-02-12 12:56 被阅读0次

    前言概述

    最近在找工作,mysql因为是项目主要用到的数据库,但由于平时只注重业务需求,而且数据库操作只停留在表皮上的增删改查,面试时根本不够用。怎么办?没办法啊!! 只能恶补了,不求啥啥都会,但是索引这块必须的要有一个大体的了解。找了很多资料,感觉都是大牛,我就还是选择搬运吧,O(∩_∩)O哈哈~

    索引概念

    索引在MySQL中也叫是一种“键”,是存储引擎用于快速找到记录的一种数据结构。

    索引原理

    通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。

    从上面的描述中可以看出索引主要做两件事:排序 + 查找

    如何创建索引

    1 #方法一:创建表时
     2       CREATE TABLE 表名 (
     3                 字段名1  数据类型 [完整性约束条件…],
     4                 字段名2  数据类型 [完整性约束条件…],
     5                 [UNIQUE | FULLTEXT | SPATIAL ]   INDEX | KEY
     6                 [索引名]  (字段名[(长度)]  [ASC |DESC]) 
     7                 );
     8 
     9 
    10 #方法二:CREATE在已存在的表上创建索引
    11         CREATE  [UNIQUE | FULLTEXT | SPATIAL ]  INDEX  索引名 
    12                      ON 表名 (字段名[(长度)]  [ASC |DESC]) ;
    13 
    14 
    15 #方法三:ALTER TABLE在已存在的表上创建索引
    16         ALTER TABLE 表名 ADD  [UNIQUE | FULLTEXT | SPATIAL ] INDEX
    17                              索引名 (字段名[(长度)]  [ASC |DESC]) ;
    18                              
    19 #删除索引:
    20         DROP INDEX 索引名 ON 表名字;
    

    创建索引需要遵循哪些原则

    1. 搜索的索引列,不一定是查询列,最适合创建索引的列是跟在where条件中的列;
    2. 使用唯一索引,列中的数值差异越大越明显,记录性别的字段,只包含两种情况,对其创建索引没有多大用途;
    3. 尽量使用短索引;
    4. 如果数据频繁的更新或删加,就不宜建立索引

    什么情况下索引会失效

    1. like '%xx'
      select * from tb1 where email like '%cn';
    2. 使用函数
      select * from tb1 where reverse(email) = 'wupeiqi';
    3. or
      select * from tb1 where nid = 1 or name = 'seven@live.com';
    4. 类型不一致
      如果列是字符串类型,传入条件是必须用引号引起来
      select * from tb1 where email = 999;
    5. 组合索引最左前缀
      如果组合索引为:(name,email)
      name and email -- 使用索引
      name -- 使用索引
      email -- 不使用索引
    6. 没有查询条件,或者查询条件没有建立索引;
    7. 对索引列进行运算导致索引失效,我所指的对索引列进行运算包括(+,-,*,/,! 等)

    mysql中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响

    普通索引: 允许被索引的数据列包含重复的值。
    唯一索引: 唯一索引可以保证数据记录的唯一性。
    主键索引:是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字PRIMARY KEY 来创建。
    联合索引:覆盖多个数据列。
    正确使用索引可以提高查询效率,但由于建立索引需要占用物理空间,当对表进行增、删、改的时候索引也要动态维护,这样就降低了数据的维护速度。所以建立索引前要考虑。

    B+ Tree索引和Hash索引有哪些区别

    存储格式上,Hash使用key-value形式;b+tree是多路平衡二叉树。
    哈希索引适合等值查询,但是无法进行范围查询
    哈希索引没办法利用索引完成排序
    哈希索引不支持多列联合索引的最左匹配规则

    b+tree的叶子节点都能存什么

    直接存放数据的,叫聚簇索引。
    存放主键,叫非聚簇索引。

    聚簇索引和非聚簇索引区别

    1、聚簇索引:
    将数据存储与索引放到了一块,找到索引也就找到了数据将数据存储与索引放到了一块,找到索引也就找到了数据。
    a) 一个索引项直接对应实际数据记录的存储页,可谓“直达”
    b) 主键缺省使用它
    c) 索引项的排序和数据行的存储排序完全一致,利用这一点,想修改数据的存储顺序,可以通过改变主键的方法(撤销原有主键,另找也能满足主键要求的一个字段或一组字段,重建主键)
    d) 一个表只能有一个聚簇索引(理由:数据一旦存储,顺序只能有一种)

    2、非聚簇索引:
    将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因。
    a) 不能“直达”,可能链式地访问多级页表后,才能定位到数据页
    b) 一个表可以有多个非聚簇索引

    mysql中聚簇索引的设定

    聚簇索引默认是主键,如果表中没有定义主键,InnoDB 会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB 会隐式定义一个主键来作为聚簇索引。InnoDB 只聚集在同一个页面中的记录。包含相邻健值的页面可能相距甚远。

    文章引用

    https://www.cnblogs.com/Eva-J/articles/10126413.html
    他讲的非常全面,我这里只针对面试常问的点做总结,如果要更深入的理解索引,还需要了解很多数据结构,计算机基础方面的知识。我们还很年轻,年轻就得学啊!!

    相关文章

      网友评论

          本文标题:MySQL面试 -- 索引

          本文链接:https://www.haomeiwen.com/subject/xqfsjftx.html