美文网首页
MySQL面试题 | 附答案解析(四)

MySQL面试题 | 附答案解析(四)

作者: 嗯哼_9793 | 来源:发表于2020-04-13 13:14 被阅读0次

    7. 索引算法有哪些?

    索引算法有 BTree算法和Hash算法

    BTree算法

    BTree是最常用的mysql数据库索引算法,也是mysql默认的算法。因为它不仅可以被用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作符,只要它的查询条件是一个不以通配符开头的常量, 例如:

    -- 只要它的查询条件是一个不以通配符开头的常量

    select * from user where name like 'jack%';

    -- 如果一通配符开头,或者没有使用常量,则不会使用索引,例如:

    select * from user where name like '%jack';

    Hash算法

    Hash Hash索引只能用于对等比较,例如=,<=>(相当于=)操作符。由于是一次定位数据,不像BTree索引需要从根节点到枝节点,最后才能访问到页节点这样多次IO访问,所以检索效率远高于BTree索引。

    8. 索引设计的原则?

    适合索引的列是出现在where子句中的列,或者连接子句中指定的列

    基数较小的类,索引效果较差,没有必要在此列建立索引

    使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间

    不要过度索引。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长。所以只保持需要的索引有利于查询即可。

    9. 创建索引的原则(重中之重)

    索引虽好,但也不是无限制的使用,最好符合一下几个原则

    1) 最左前缀匹配原则,组合索引非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

    2)较频繁作为查询条件的字段才去创建索引

    3)更新频繁字段不适合创建索引

    4)若是不能有效区分数据的列不适合做索引列(如性别,男女未知,最多也就三种,区分度实在太低)

    5)尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。

    6)定义有外键的数据列一定要建立索引。

    7)对于那些查询中很少涉及的列,重复值比较多的列不要建立索引。

    8)对于定义为text、image和bit的数据类型的列不要建立索引。

    10. 创建索引的三种方式,删除索引

    第一种方式:在执行CREATE TABLE时创建索引

    第二种方式:使用ALTER TABLE命令去增加索引

    ALTER TABLE table_name ADD INDEX index_name (column_list);

    1

    ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。

    其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。

    索引名index_name可自己命名,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。

    第三种方式:使用CREATE INDEX命令创建

    CREATE INDEX index_name ON table_name (column_list);

    CREATE INDEX可对表增加普通索引或UNIQUE索引。(但是,不能创建PRIMARY KEY索引)

    删除索引

    根据索引名删除普通索引、唯一索引、全文索引:alter table 表名 drop KEY 索引名

    alter table user_index drop KEY name;

    alter table user_index drop KEY id_card;

    alter table user_index drop KEY information;

    删除主键索引:alter table 表名 drop primary key(因为主键只有一个)。这里值得注意的是,如果主键自增长,那么不能直接执行此操作(自增长依赖于主键索引):

    需要取消自增长再行删除:

    alter table user_index

    -- 重新定义字段

    MODIFY id int,

    drop PRIMARY KEY

    但通常不会删除主键,因为设计主键一定与业务逻辑无关。

    最后,小编分类整理了许多java进阶学习材料和BAT面试给热爱IT行业的你,如果需要资料的请转发此文章后再私聊小编回复【java】就能领取2019年java进阶学习资料和BAT面试题以及《Effective Java》(第3版)电子版书籍。也可以加群:712263501领取海量学习资料进行学习。

    相关文章

      网友评论

          本文标题:MySQL面试题 | 附答案解析(四)

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