6.27_JAVA_面试(被抽到了)
1.MYSQL支持的存储引擎有哪些, 有什么区别 ?
In-no-DB(默认):支持事务安全(数据库运行时,能保证数据的一致性、完整性),支持表行锁,支持物理和逻辑外键。占用磁盘空间大。
MEMORY:只支持逻辑外键,只支持表锁,不支持事务安全
My-I-SAM:只支持逻辑外键,只支持表锁,不支持事务安全
2 了解过Mysql的索引嘛 ?
索引能帮助MySQL高效获取数据。如果查找某个字段的话,MYsql查询很慢,因为它是磁盘读取以及时间复杂度是On,但是我们通过索引能够大大加快寻找这个数据的速度。索引在Mysql的底层是构建了一个B+🌳,把这个字段的数据放进去了。
它底层是通过构建B+树把建立的索引字段给纳入进去了。
B和B+树区别:
1️⃣B每个节点都存储数据,但B+只有叶子节点下一层存储数据
B+树非叶节点存的数据是这个数据指向的节点的最大值。如,上图第二行第一个节点中的15指向的是第三行第一个节点的最大值15.
B树的叶子节点下一层为空节点。B+树叶子节点下一层保存的是数据。
3 索引的底层数据结构了解过嘛 ?
如上,123是同一个答案。
4 什么是聚簇索引什么是非聚簇索引 ?
InnoDB索引引擎中,分为二级索引和聚集索引。
聚集索引:数据和索引存到了一起,必须有,且只有一个。字段通常唯一
二级索引:数据和索引分开的。
聚集索引的叶子节点存储的是行数据,但是二级索引存储的是行数据的主键id、索引字段所对应的数据。不存行数据是为了减少数据量。可以有多个。
5 知道什么是回表查询嘛 ?
要查询的字段,不在构建的索引的字段之内。
通常一个二级索引,最后回到聚集索引的情况叫做会表。比如search * from user where name = 'Amy'
其中name已经创立了二级索引,但是由于二级索引的叶子是主键ID,找不到*要查询的name为Amy的数据的所有字段所对应的值,只能回到聚集索引表,故称回表。
6 索引创建原则有哪些?
1️⃣一般对经常查询,且数据量大的表建立索引。因为索引能大大加快查找速度。
2️⃣如果搜的比较少,或者表很小的时候可以不建立索引。因为索引会消耗磁盘空间。
3️⃣尽量使用字段空间小的做索引,比如char100比char10大,一般选char10做索引。
4️⃣前缀检索:如果要搜索的字段所对应的数据都比较大,比如字段“备注”里面存的数据都非常长。一般会只检索字段前面的若干字符。
5️⃣尽量采用区分度高的做索引,区分度越高,索引就越常用。
6️⃣使用复合索引时不能跳过对应的条件。我们使用复合索引需要先创建复合索引,如果创建了INDEX(A,B,C,D),我们where A C B D,顺序不同可以跑通,但是如果where BCD去掉了A,那么ABCD都跑不了。如果去掉了B,那么BCD都跑不了。这叫最左前缀匹配原则。很重要。
7️⃣一般建立联合索引,多放几个常用的区分度达到额字段进去,避免索引到超出联合索引包含的字段时回表。
8️⃣一般常被where、group by、order by的字段建立索引。
7 知道什么是左前缀原则嘛 ?
同上。复合索引。可以顺序不同,但是不能跳过
8 知道什么叫覆盖索引嘛 ?
和回表相反。意思是我们要查的字段,包含在索引的字段之内
比如
CREATE INDEX idx_username ON users(username, email, age);//创建了索引,索引包含字段username、email、age
SELECT username, email FROM users WHERE username = 'john';//我们要查的字段是只有上述的username和email,被完全包含在了里面
9 索引是越多越好嘛? 什么样的字段需要建索引, 什么样的字段不需要 ?
索引不是越多越好,建立索引也会消耗空间,而且索引字段变多查找效率也会降低。
一般常被where、group by、order by的字段建立索引。不常用的不用建。