mysql面试整理

1.什么是索引

排好序的快速查找的数据结构

2.索引类型

普通索引(Normal Index):也称为非唯一索引,是最基本的索引类型。它在索引列上创建一个普通的B-Tree索引结构,可以加快查询速度,但允许索引列中存在重复的值。

唯一索引(Unique Index):唯一索引是在索引列上创建一个唯一性约束,用于保证索引列中的值唯一。与普通索引不同的是,唯一索引要求索引列中的值不能重复,如果插入或更新数据时违反唯一性约束,则会产生唯一性冲突错误。

主键索引(Primary Key Index):主键索引是一种特殊的唯一索引,用于唯一标识表中的每一行数据。主键索引要求索引列的值不能为NULL,并且唯一性约束是自动创建的。一个表只能有一个主键索引。

复合索引(Composite Index):复合索引是指在多个列上创建的索引,也称为多列索引。通过在多个列上创建索引,可以提高多列条件查询的性能。复合索引的顺序很重要,查询时需要按照索引列的顺序来使用。

全文索引(Full-Text Index):全文索引用于对文本内容进行全文检索。它可以在文本字段上创建索引,用于高效地搜索和匹配关键词。全文索引支持关键词的模糊匹配和排序。

3.索引优劣

建立目录,提高数据检索的效率,降低数据库IO成本,通过索引列队数据进行排序,降低数据排序成本,降低了CPU的消耗
索引过多暂用空间越多,还会影响更新增加删除的速

4.索引失效情况

使用or没有每个建索引,like以%,!⁼等模糊查询条件会失效
如果是string,用int查询会失效,要带引号
数据过少
使用函数或者计算

5.数据表建立索引的原则有哪些?

建立索引是提高数据库查询性能的重要手段之一,以下是一些建立索引的原则:

唯一性原则:对于主键、唯一约束或者需要保持唯一性的列,应该建立唯一索引。这样可以保证数据的唯一性,并且可以加速对该列的查找操作。
频繁查询原则:对于频繁被查询的列,应该建立索引。这样可以加速相关查询的执行速度,提高数据库的查询性能。
条件查询原则:对于经常用于查询条件的列,应该建立索引。这样可以加速满足条件的查询操作,提高查询效率。
联合查询原则:对于经常同时使用多个列作为查询条件的查询语句,应该建立联合索引。这样可以将多个列作为一个索引来提高查询效率。
数据量原则:对于较大的数据表,应该建立索引。因为在大数据表中进行全表扫描的代价非常高,而建立索引可以加速查询。
避免过多索引原则:过多的索引会增加数据库的维护成本,并且会影响数据的插入、更新和删除操作的性能。因此,应该避免过度索引,只建立必要的索引。
数据类型原则:对于文本类型或者较长的列,应该慎重考虑是否需要建立索引。因为这些列的索引会占用较多的存储空间,并且会影响索引的效率。 需要根据具体的业务需求和数据库查询情况来综合考虑建立索引的原则,以达

6.什么情况下不宜建立索引?

在某些情况下,建立索引可能不是一个明智的选择,以下是一些情况下不宜建立索引的考虑:
数据表非常小:如果数据表非常小,比如只有几十行甚至更少,建立索引的性能收益可能非常有限,甚至可能造成性能下降。因此,在小型表上建立索引可能是不必要的。
数据表频繁进行大量的插入、更新和删除操作:建立索引会增加对数据表的维护成本,对于频繁进行大量的插入、更新和删除操作的数据表,索引的维护成本可能会超过索引带来的性能提升。在这种情况下,可以考虑是否真的需要建立索引。
数据表的查询非常少或者很少有涉及到索引字段的查询:如果一个数据表很少被查询,或者很少有涉及到索引字段的查询,那么建立索引的性能收益可能非常有限。在这种情况下,可以考虑不建立索引。
数据表的列值基本上都是唯一的:如果数据表的列值基本上都是唯一的,那么建立索引的效果会降低,因为索引的选择性较低。在这种情况下,可以考虑不建立索引。
查询性能已经足够好:如果数据表的查询性能已经足够好,没有明显的性能瓶颈,那么建立索引可能是不必要的。在这种情况下,可以考虑不建立索引,以减少对数据库的维护开销。 需要根据具体的业务需求和数据库查询情况来综合考虑是否建立索引,以及建立哪些索引。在决策之前,可以使用数据库的查询优化工具或者进行一些测试来评估建立索引的影响。

7.索引最左匹配原则

索引最左匹配原则是数据库索引的一种使用规则,它指的是在复合索引(Composite Index)中,如果查询条件只涉及到了复合索引的前缀列,那么数据库可以利用该索引进行查询和优化。

具体来说,假设有一个复合索引包含了多个列 A、B、C,当查询条件中只涉及到了列 A 或者列 A 和列 B,而没有涉及到列 C 时,数据库可以利用该复合索引进行查询和过滤。但是,如果查询条件中涉及到了列 C,而没有涉及到列 A 或者列 A 和列 B,那么复合索引将无法被利用。 这个原则的作用是通过最左前缀来提高查询效率,减少索引的扫描范围,从而提高查询速度。

因此,在设计复合索引时,需要根据实际的查询场景和需求,合理选择索引的列顺序,将经常用作查询条件的列放在前面。 需要注意的是,索引最左匹配原则并不适用于所有数据库,不同的数据库系统可能会有不同的索引实现和优化策略。因此,在具体的数据库环境中,建议根据数据库的特性和性能特点来进行索引的设计和优化。

8.mysql索引优化

选择合适的索引类型
避免过多的索引
避免使用select *进下查询,只选择需要的列

9.MyISAM和 InnoDB 的基本区别?

A、MyISAM类型不支持事务,表锁,易产生碎片,要经常优化,读写速度较快,适合用于频繁查询的应用;
B、InnoDB类型支持事务,行锁,有崩溃恢复能力,读写速度比MyISAM慢,适合于插入和更新操作比较多的应用,空间占用大,不支持全文索引等。
创建索引:alert table tablename add index 索引名 (字段名)

10.msyql悲观和乐观锁属于共享锁、排他锁?

死锁(Deadlock)是指两个或多个事务相互等待对方所持有的资源,导致所有事务都无法继续执行的情况。简单来说,就是两个或多个事务在彼此等待对方释放资源,从而陷入了无法继续的僵持状态。
脏读(Dirty Read)是指一个事务读取到了另一个事务未提交的数据。当一个事务在读取数据时,另一个事务对该数据进行了修改但尚未提交,此时第一个事务读到的数据是不一致的或无效的。
幻读(Phantom Read)是指一个事务在读取数据时,另一个事务对相同的数据进行了插入或删除操作,从而导致第一个事务读取到了不一致的数据行。幻读与脏读的区别在于,脏读是读取到了未提交的修改数据,而幻读是读取到了其他事务已提交的新增或删除数据。
不可重复读(Non-repeatable Read)是指一个事务在读取数据时,另一个事务对相同的数据进行了修改并提交,导致第一个事务多次读取同一数据时,得到的结果不一致。不可重复读与幻读的区别在于,不可重复读是读取到了其他事务已提交的修改数据,而幻读是读取到了其他事务已提交的新增或删除数据。 这些问题主要出现在并发事务处理的环境中,是由于多个事务同时对数据库进行读写操作而引发的。为了解决这些问题,数据库系统提供了不同的隔离级别(如读未提交、读已提交、可重复读和串行化),开发人员可以根据具体情况选择合适的隔离级别来避免或减少这些问题的发生

11.简述一下MySQL left join、right join以及inner join的区别 ?

LEFT JOIN:左连接会返回左表中的所有记录,以及右表中与左表匹配的记录。如果右表中没有匹配的记录,则返回NULL值。左连接关键字是LEFT JOIN或LEFT OUTER JOIN。
RIGHT JOIN:右连接会返回右表中的所有记录,以及左表中与右表匹配的记录。如果左表中没有匹配的记录,则返回NULL值。右连接关键字是RIGHT JOIN或RIGHT OUTER JOIN。
INNER JOIN:内连接只返回左表和右表中匹配的记录。它根据连接条件从两个表中筛选出匹配的行。内连接关键字是INNER JOIN。 总结:
LEFT JOIN返回左表中的所有记录和匹配的右表记录。
RIGHT JOIN返回右表中的所有记录和匹配的左表记录。
INNER JOIN只返回左表和右表中匹配的记录。 需要注意的是,连接条件的正确性对连接的结果有重要影响。另外,如果在连接操作中使用了WHERE子句,则可能会将连接操作转换为内连接,因此需要谨慎使用

12.简述一下count(1)、count(*)与count(列名)的执行区别 ?

COUNT(1):当使用COUNT(1)时,实际上是在计算满足条件的行数。在每一行中,1表示一个常数,不需要额外的计算和检索,因此执行效率相对较高。这种写法通常被用于简单的行数统计。
COUNT():当使用COUNT()时,实际上是在计算满足条件的行数。表示选择所有的列,因此在计算行数时,需要将所有的列的值检索出来,这可能会产生额外的开销。在某些情况下,如果表中的列数较多或者表的行数较大,使用COUNT()可能会导致性能下降。
COUNT(列名):当使用COUNT(列名)时,实际上是在计算满足条件的非空行数。这种写法会对指定的列进行计数,并且只计算该列的非空值。如果指定的列存在NULL值,这些NULL值将不会被计数在内。 总结:
COUNT(1)是最常用的写法,它在每一行中都返回一个常数,不需要额外的计算和检索,因此执行效率相对较高。
COUNT(*)会检索所有的列的值,并计算满足条件的行数。在某些情况下可能会产生额外的开销,特别是当表的列数较多或者表的行数较大时。
COUNT(列名)会对指定的列进行计数,并且只计算该列的非空值。如果指定的列存在NULL值,这些NULL值将不会被计数在内。

  • 12
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值