mysql简答

时间:2024-10-29 07:26:28

mysql简答

1、请说明在 MySQL 中如何限定查询结果显示的条数。

在MySQL中,可以使用LIMIT子句来限定查询结果的条数。LIMIT子句接受一个或两个数值参数。第一个参数指定返回记录的偏移量,第二个参数指定要返回的记录数。

如果只给出一个参数,它表示返回记录的数量,偏移量默认从0开始。

2.简述mysql存储引擎innodb与myisam的区别:

InnoDB:

  • 支持事务,有回滚和提交操作,确保数据的完整性。
  • 支持行级锁定,提供更高的并发处理能力。
  • 支持外键约束,保证数据的一致性和完整性。
  • 对于有全文搜索需求的应用,可以使用InnoDB的FULLTEXT索引。
  • 对于备份和恢复,InnoDB的表的备份和恢复更加方便。
  • 对于大多数OLTP(在线事务处理)应用,推荐使用InnoDB。

MyISAM:

  • 不支持事务,不支持回滚操作。
  • 支持表级锁定,并发写入时性能较差。
  • 不支持外键约束。
  • 提供全文搜索功能,但从MySQL 5.6开始,InnoDB也开始支持FULLTEXT索引。
  • 对于不需要事务支持的应用,或者需要全文搜索的旧应用,MyISAM可能是更好的选择。
3、简述事物的四个特性。

**原子性(Atomicity)**‌:事务中的所有操作要么全部执行,要么全部不执行,确保数据库的完整性。如果事务中的任何操作失败,整个事务将被回滚,恢复到事务开始前的状态‌12。

‌**一致性(Consistency)**‌:事务必须使数据库从一个一致性状态变到另一个一致性状态,确保数据的正确性和完整性。事务执行前后,数据库的状态必须保持一致‌12。

‌**隔离性(Isolation)**‌:事务的执行应该与其他事务的执行隔离,确保并发执行的事务之间不会相互干扰。一个事务内部的操作及使用的数据对并发的其他事务是隔离的‌12。

‌**持久性(Durability)**‌:一旦事务提交,对数据库的改变是永久的,即使系统发生故障也不会丢失。事务一旦提交,对数据库的所有更新都应永久地反映在数据库中‌12。

4、简述哪些情况下需要添加索引,添加什么索引,添加在那些列上,列有什么特点。

以下情况下需要添加索引‌:

  1. 数据量较大的表‌:数据量较大的表查询效率较低,需要创建索引来提高查询速度‌1。
  2. 经常被查询的表‌:经常被查询的表需要创建索引来加速查询操作‌1。
  3. 进行连接操作的表‌:进行连接操作的表需要创建索引来提高连接效率‌1。
  4. 经常用于查询条件的字段‌:在where条件里面经常用到的字段,如果不加索引,每次查询都要全表扫描,随着数据量增长查询效率迅速下降‌2。
  5. 查找单条记录的字段‌:对于查找单条记录的字段创建唯一索引,可以直接定位到记录‌2。
  6. 表与表的关联键‌:在表与表的关联键上创建索引,可以快速匹配关联键值‌2。
  7. 经常需要排序的字段‌:在经常需要排序的字段建立索引,避免全表扫描‌2。
  8. 聚合函数‌:对聚合字段添加索引,可以加速聚合函数的执行‌3。
  9. DISTINCT字段‌:对DISTINCT字段创建索引,提升去重效率‌4。
  10. UPDATE、DELETE操作‌:对UPDATE、DELETE操作的WHERE条件列创建索引,提升更新和删除操作的效率‌4。

添加什么索引‌:

  1. 唯一索引‌:对于查找单条记录的字段创建唯一索引,确保数据的唯一性‌2。
  2. 普通索引‌:适用于经常被查询、排序、分组的字段‌2。
  3. 复合索引‌:在多个字段上创建复合索引,适用于经常一起使用的字段组合‌2。

添加在哪些列上‌:

  1. 经常用于查询条件的字段‌:如WHERE条件中的字段‌2。
  2. 查找单条记录的字段‌:如主键或唯一键‌2。
  3. 表与表的关联键‌:如外键或关联字段‌2。
  4. 经常需要排序的字段‌:如ORDER BY子句中的字段‌2。
  5. 聚合函数涉及的字段‌:如SUM、AVG等聚合操作涉及的字段‌3。
  6. DISTINCT操作的字段‌:如需要进行去重的字段‌4。
  7. UPDATE、DELETE操作的WHERE条件列‌:如UPDATE、DELETE操作中的WHERE条件列‌4。

列的特点‌:

  1. 数据分布均匀‌:选择数据分布均匀的字段来建立索引,可以提高查询效率‌1。
  2. 查询频率高‌:选择经常被查询的字段来建立索引,可以提高查询效率‌2。
  3. 唯一性限制‌:对于具有唯一性限制的字段,如主键或唯一键,自动创建索引‌4。
  4. 列的数据类型小‌:选择数据范围小的列类型,如使用INT而不是VARCHAR,可以减少索引的大小和提高查询速度‌4。
5、 UNION 与 UNION ALL 的区别

结果集去重和排序‌:

  • UNION‌:对两个结果集进行并集操作,不包括重复行,相当于使用了 DISTINCT,同时进行默认规则的排序‌12。
  • UNION ALL‌:对两个结果集进行并集操作,包括重复行,即所有的结果全部显示,不管是不是重复,且不会对获取的结果进行排序操作‌12。

执行效率‌:

  • UNION‌:由于需要进行去重和排序操作,执行效率相对较低‌12。
  • UNION ALL‌:只是简单地合并两个结果集,不进行去重和排序,因此执行效率较高‌12。

使用场景‌:

  • 当需要合并的结果集中包含重复数据且不需要排序时,使用 ‌UNION ALL‌ 可以提高查询效率。
  • 当需要合并的结果集中不包含重复数据或需要对结果进行排序时,使用 ‌UNION‌ 可以确保结果的唯一性和排序的正确性。
6、解释脏读、幻读、不可重复读

1. 脏读 (Dirty Read)

定义:脏读发生在一个事务可以读取另一个事务尚未提交的数据。这意味着一个事务可能读取到未确认的、更改的数据,可能会导致不一致的结果。

示例

  • 事务 A 更新了一行数据但未提交。
  • 事务 B 读取了这个未提交的数据。
  • 如果事务 A 后来回滚了修改,事务 B 读取到的数据就变成了“脏数据”,因为它读取到了一个本不会被永久保存的值。

影响:脏读可能导致读取到不准确或不一致的数据,从而影响应用程序的逻辑。

2. 不可重复读 (Non-repeatable Read)

定义:不可重复读是指在同一个事务中,读取到同一数据行的结果可能在该事务的后续读取中发生变化。换句话说,一个事务在读取某行数据时,另一个事务对该行数据进行了更新或删除,导致第一个事务读取的数据不一致。

示例

  • 事务 A 在查询一行数据。
  • 事务 B 更新了事务 A 查询的数据并提交。
  • 事务 A 再次查询同一行数据时,发现值发生了变化。

影响:不可重复读会导致事务在同一操作中读取到不同的值,从而可能产生逻辑错误。

3. 幻读 (Phantom Read)

定义:幻读是指在一个事务中,连续两次查询同一条件时,第二次查询返回了不同的结果集。这通常发生在插入或删除操作中,当一个事务在查询数据时,另一个事务插入了新数据,导致查询结果集的变化。

示例

  • 事务 A 查询满足某个条件的所有数据行。
  • 事务 B 插入了一行新的数据,使得满足条件的数据行数增加。
  • 事务 A 再次执行相同的查询,发现结果集发生了变化(即出现了“幻影”行)。

影响:幻读会导致事务在不同时间点之间的数据不一致,可能影响数据的完整性和准确性。