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。
- 进行连接操作的表:进行连接操作的表需要创建索引来提高连接效率1。
- 经常用于查询条件的字段:在where条件里面经常用到的字段,如果不加索引,每次查询都要全表扫描,随着数据量增长查询效率迅速下降2。
- 查找单条记录的字段:对于查找单条记录的字段创建唯一索引,可以直接定位到记录2。
- 表与表的关联键:在表与表的关联键上创建索引,可以快速匹配关联键值2。
- 经常需要排序的字段:在经常需要排序的字段建立索引,避免全表扫描2。
- 聚合函数:对聚合字段添加索引,可以加速聚合函数的执行3。
- DISTINCT字段:对DISTINCT字段创建索引,提升去重效率4。
- UPDATE、DELETE操作:对UPDATE、DELETE操作的WHERE条件列创建索引,提升更新和删除操作的效率4。
添加什么索引:
- 唯一索引:对于查找单条记录的字段创建唯一索引,确保数据的唯一性2。
- 普通索引:适用于经常被查询、排序、分组的字段2。
- 复合索引:在多个字段上创建复合索引,适用于经常一起使用的字段组合2。
添加在哪些列上:
- 经常用于查询条件的字段:如WHERE条件中的字段2。
- 查找单条记录的字段:如主键或唯一键2。
- 表与表的关联键:如外键或关联字段2。
- 经常需要排序的字段:如ORDER BY子句中的字段2。
- 聚合函数涉及的字段:如SUM、AVG等聚合操作涉及的字段3。
- DISTINCT操作的字段:如需要进行去重的字段4。
- UPDATE、DELETE操作的WHERE条件列:如UPDATE、DELETE操作中的WHERE条件列4。
列的特点:
- 数据分布均匀:选择数据分布均匀的字段来建立索引,可以提高查询效率1。
- 查询频率高:选择经常被查询的字段来建立索引,可以提高查询效率2。
- 唯一性限制:对于具有唯一性限制的字段,如主键或唯一键,自动创建索引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 再次执行相同的查询,发现结果集发生了变化(即出现了“幻影”行)。
影响:幻读会导致事务在不同时间点之间的数据不一致,可能影响数据的完整性和准确性。