关于mysql的一些总结

前言

       相信大多数小伙伴都和我一样在面试的时候往往会被面试官问到关于mysql的问题,有的面试官会问sql优化,有的会问sql书写。今天就将我之前遇到过的一些面试过程中遇到的sql问题分享给大家。

一、数据库引擎

    有的面试官在考察时会问是mysql的引擎。mysql的引擎分为多种:

    InnoDB、MyIsAM、Memory(堆内存)、Mrg_Myisam(分表的一种方式)、Blackhole(黑洞引擎)

    其中我们用的比较多的就是InnoDBMyIsAM,那我们来简单看一下这两种引擎有什么有些和缺点,又有什么相同和不同之处。

MyIsAM:

        定义:

        MyIASM是MySQL默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。

        缺点:

        就是不能在表损坏后恢复数据(不能主动恢复)。

InnoDB:

        定义:

        InnoDB是一个事务型的存储引擎,有行级锁定和外键约束。从mysql5.5之后做为mysql默认的存储引擎,支持数据的提交、回滚、崩溃回复能力(通过bin-log日志等方式恢复)的事务安全。支持自动增加列属性auto_increment(通常定义自增主键)。支持索引。

        总结:

        关于MyIsAM和InnoDB的对比我就不在做深入的对比,毕竟这个问题在面试中出先的概率也不会很大,总结一下它们之间的区别主要是在:事务、行锁、索引存储方式四个方面。有感兴趣的小伙伴可以进行深入了解。

二、Sql优化

       这是一个必问题,几乎问到mysql的所有面试官都会问这个问题:你平时在开发过程中对sql怎么优化?

       关于sql优化的问题我将结合多方面来回答:

       关键字慎用:

            1.我们在查询某个字段或者多个字段尽量使用查询字段来代替*,返回过多无用字段会降低查询效率。

            2.like查询,尽量不适用like查询中的同时左右%的like查询,这样会导致无法命中索引(右like可以命中索引)。

            3.尽量不要使用in、not in关键字,尽量使用between替换in

            4.尽量不要使用or,or关键字会造成全表扫描

            5.where后面尽量少用函数,尽量不要对null值进行判断,不要使用where 1 = 1

       数据库索引:

             1.在sql语句前加上explain关键字可以查看sql语句的执行情况:

                  执行时间、搜索type、是否命中索引(是否建立索引)、扫描行数等相关信息。

             2.创建索引:对于一些经常需要查询的字段创建索引可提高查询效率。

                  创建索引的方式: 

                    普通索引:CREATE INDEX indexName ON mytable(username(length));

                    唯一索引:CREATE UNIQUE INDEX indexName ON mytable(username(length));

                    或者在创建数据库表的时候直接创建。

             3.什么是聚集索引?

                    聚集索引就是InnoDB默认的排序表,使用InnoDB的mysql数据库里面的数据排列顺序是严格按照顺序存放的,物理存放顺序和索引的顺序是一样的。

             4.什么是组合索引?什么是组合索引的最左原则?

               组合索引是指在某个表里面对两个及以上字段建立索引,这时候查询的where里面只要带着最左变的列进行查询,就可以命中索引。如:

              table_demo 中对A、B、C三列建立组合索引,相当于建立了A、B、C、(ABC)索引,查询的where条件之后跟A、B、C、(ABC)都能够命中索引。

               最左原则:只要查询条件中有建立索引时的最左边的那列便可以命中索引,不管他在查询条件中的位置是否最左。

                例:select  B from table_demo where C = ? and A = ?;

               5.对某个非常的字段做索引?可以吗?我应该怎么处理才行?  

                mysql对长字段是不能够做索引的,但是有些业务涉及到的字段确实很长,却又希望让其作为索引的场景。这种情况的处理方式是在其原来表的基础上再添加一个字段,该字段存放目标字段的hash值,然后再对该值做索引处理。查询的时候已该字段查询便能命中索引,在存放hash值的时候可能会出现相同的hashcode(hash碰撞)所以还学要在这里面中继续查询。

                select * from table_hash where name_hash = HASH("good") and name = "good";

               6.你知道索引的的数据结构是什么吗?为什么不是B tree 而是 B+ tree?

                  索引的数据结构是B+ tree,B+树和B树的区别是B+树中只有叶子节点在存放数据,而B树里面无论是根节点还是叶子节点都是存放的数据。在内存相同的情况下,B+树可以命中更多的索引,故而选用B+树。

                   面试官问到这里的时候可能会接着往下问B+树的数据结构和实现方式,有兴趣的小伙伴可以看看。

三、数据库分表

                  这部分我并没有做过实际的项目,谈谈我的思路,一般来说,可以根据主键的hashcode来做一个分表的操作,看分为几个表,或者是按照数据的热度、插入的时间都可以进行分表。

                  在分库分表中通常会使用到一个工具mycat,同时应该也会结合elasticsearch一起使用。

                  待我在实际工作中使用到mycat的时候再和大家分享!

原创文章 18 获赞 3 访问量 1643

猜你喜欢

转载自blog.csdn.net/qq_39941165/article/details/103610696
今日推荐