数据库事务与索引详解

5星 · 超过95%的资源 2 下载量 138 浏览量 更新于2024-08-28 收藏 166KB PDF 举报
之间是隔离的; 持久性(Durability):一旦事务提交,其结果将永久保存在数据库中,即使系统故障,也不会丢失。 2. 幻读和不可重复读的区别 幻读和不可重复读都是并发控制中可能出现的问题。不可重复读发生在同一个事务中,用户在同一事务内多次读取同一数据集时,读到的数据可能会发生变化。例如,用户第一次读取某条记录,然后其他事务插入一条新记录,用户再次读取时,会看到新插入的记录,这就是不可重复读。幻读则是在不同的事务中,一个事务在执行查询时,另一个事务插入了一些满足查询条件的新行,导致第二次查询返回了第一次查询时不存在的结果,就像出现了幻觉一样。 3. MySQL的默认隔离级别和实际企业中常用的隔离级别 MySQL的默认隔离级别是可重复读(Repeatable Read),它通过多版本并发控制(MVCC)来实现。在实际企业中,通常也会选择这个隔离级别,因为可重复读可以避免不可重复读的问题,同时在大多数情况下也能防止幻读。但是,对于某些特定场景,如需要严格防止幻读,可能会选择串行化(Serializable)隔离级别,但这样会降低系统的并发性能。 4. 使用索引的原因 索引可以极大地提高数据库的查询速度。没有索引时,数据库需要进行全表扫描,即逐行检查直到找到匹配的记录。而有了索引,数据库可以直接定位到目标数据,大大减少了I/O操作,提高了查询效率。 5. 不对每个字段创建索引的原因 虽然索引可以加速查询,但并非所有字段都需要创建索引。索引会占用额外的存储空间,并且在插入、更新和删除操作时,需要维护索引,这会增加数据库的维护成本。此外,过多的索引可能会影响写操作的性能。 6. 索引提升查询速度的原理 索引就像是书的目录,帮助数据库快速定位到所需数据。通过索引,数据库可以直接跳过大部分无关数据,只需要扫描索引中的部分节点就能找到目标,从而减少了数据查找的时间。 7. 索引失效的情况 索引可能在以下情况下失效:全表扫描时;使用不匹配索引的查询条件(如对索引字段使用函数或运算符);索引列包含NULL值;使用OR连接的条件,如果其中一部分无法利用索引;索引被大量重复,导致选择性低;以及当使用了不等式操作符时,如果查询范围超过了索引的前导列。 8. 聚簇索引与非聚簇索引 聚簇索引决定了数据在磁盘上的物理存储顺序,索引键值与数据行存储在一起,一个表只能有一个聚簇索引。而非聚簇索引(也称为二级索引)的索引键值与数据行分开存储,数据行有单独的存储位置,非聚簇索引中包含了指向数据行的指针。 9. MySQL主要使用的数据结构 MySQL中最常见的索引数据结构是B+树,尤其是InnoDB存储引擎。B+树具有较高的查询效率,适合大量的数据存储。 10. MyISAM和InnoDB的Btree索引区别 MyISAM使用非聚簇索引,索引和数据分别存储,而InnoDB使用的是聚簇索引,索引本身就是数据的存储方式,数据行和索引键值存储在一起。 11. B+tree与B-tree的区别 B+tree的叶子节点包含所有键值,且相邻叶子节点间有指针链接,便于范围查询;而B-tree所有节点都可能包含键值和数据,查询效率相对较低。 12. 覆盖索引 覆盖索引是指查询所需的所有数据都可以从索引中直接获取,无需回表查询数据行,这可以显著提高查询速度。 13. 最左前缀原则 在MySQL中,对于复合索引,查询优化器会从左到右匹配索引的列,只要匹配到的部分是连续的,就可以使用该索引。 14. InnoDB和MyISAM的区别 InnoDB支持事务处理和行级锁定,更适合并发高、数据一致性要求高的场景;而MyISAM不支持事务,但读性能高,占用存储空间少,适合读多写少的场景。 15. SQL优化方法 包括但不限于:选择合适的数据类型,减少冗余字段,使用合适的索引,避免全表扫描,优化JOIN操作,减少子查询,使用EXPLAIN分析执行计划等。 16. 使用EXPLAIN分析SQL执行效率 EXPLAIN可以帮助我们理解SQL查询的执行过程,包括是否使用了索引、数据读取方式、执行顺序等,从而找出优化点。 17. 死锁的原因及避免方法 死锁是因为两个或多个事务相互等待对方释放资源而造成的,可以通过设置超时时间、预判死锁并回滚、按照固定的资源获取顺序等方法来避免。 18. 乐观锁和悲观锁 乐观锁在读取数据时假设不会有冲突,只有在更新时才会检查并处理冲突;悲观锁则在读取数据时就加锁,防止其他事务修改。乐观锁适用于读多写少、冲突较少的场景,悲观锁适用于写操作频繁,需要保证数据一致性的场景。 19. 乐观锁和悲观锁的应用 乐观锁常见于版本号机制或时间戳机制,更新数据时检查当前版本号或时间是否与预期一致;悲观锁则常见于数据库的行级锁。 20. Linux常用命令 如ls(列出目录内容)、cd(切换目录)、pwd(显示当前目录)、grep(搜索文件内容)、find(查找文件)、vi/vim(文本编辑器)、ps(查看进程状态)、kill(结束进程)等。 21. 查询3306端口占用情况的Linux指令 `netstat -tulnp | grep 3306` 22. 查看Java进程号PID `jps` 或 `pgrep -f java` 以上内容涵盖了数据库事务、隔离级别、索引、MySQL存储引擎的区别、SQL优化、并发控制等多个方面,旨在提供一个全面的数据库知识概述。