Mysql面试

MySQL常见锁类型

  1. 共享锁(Shared Lock):也称为读锁,多个事务可以同时持有共享锁,用于读取数据。持有共享锁的事务不会阻塞其他事务获取共享锁,但会阻塞其他事务获取排他锁。

  2. 排他锁(Exclusive Lock):也称为写锁,只有一个事务可以持有排他锁,用于写入数据。持有排他锁的事务会阻塞其他事务获取共享锁和排他锁。

  3. 意向锁(Intention Lock):意向锁是一种表级锁,用于表示事务对表中的某些行或整个表的意向。意向锁分为意向共享锁和意向排他锁。意向共享锁表示事务有意向获取共享锁,意向排他锁表示事务有意向获取排他锁。意向锁的主要作用是提高锁的并发性能。

  4. 行锁(Row Lock):行锁是粒度最小的锁,用于锁定表中的一行数据。行锁可以提高并发性能,因为多个事务可以同时锁定不同的行。

  5. 表锁(Table Lock):表锁是粒度最大的锁,用于锁定整个表。表锁会阻塞其他事务对该表的所有操作,包括读取和写入。

MySQL中的意向锁的作用

意向锁的作用主要是提高并发性能和减少锁冲突。

一种表级锁,它表示事务在获取行锁或表锁之前,先获取的一种意向性的锁。

意向共享锁(IS 锁):表示事务有意向对表中的某些行加共享锁

意向排他锁(IX 锁):表示事务有意向对表中的某些行加排他锁

当一个事务请求获取行锁时,如果该事务已经获取了表上的意向锁,那么就可以直接获取行锁,而不需要再去检查表上是否有其他事务持有锁。这样可以避免在获取行锁时进行表级锁的检查,从而提高并发性能。

另外,意向锁还可以减少锁冲突。当一个事务请求获取表锁时,如果该事务已经获取了表上的意向锁,那么就可以直接获取表锁,而不需要再去检查表上是否有其他事务持有行锁。这样可以避免在获取表锁时进行行锁的检查,从而减少锁冲突。

MySQL数据库索引

索引是一种用于提高数据库查询性能的数据结构。

加快数据的检索速度,减少磁盘I/O操作,提高数据库的性能。

索引可以创建在表的一列或多列上。当创建索引时,MySQL 会对索引列的值进行排序,并将排序后的值存储在索引中。当查询数据时,MySQL 可以使用索引快速定位到符合条件的数据行,从而提高查询效率。

按索引的对象分

主键索引(Primary Key Index):用于唯一标识表中的每一行数据,主键索引是最常用的索引类型。

唯一索引(Unique Index):用于保证索引列的唯一性,一个表可以有多个唯一索引。

普通索引(Normal Index):也称为非唯一索引,用于加速查询操作。

组合索引(Composite Index):由多个列组合而成的索引,可以提高多列查询的性能。

按索引数据结构分

  1. B 树索引:B 树是一种平衡的多路搜索树,适用于大多数数据库系统。B 树索引可以快速定位到特定的值或范围,并支持高效的插入、删除和更新操作。

  2. 哈希索引:哈希索引使用哈希函数将索引键映射到哈希表中的位置。哈希索引对于精确匹配查询非常高效,但对于范围查询和排序的支持相对较弱。

  3. 全文索引:全文索引用于对文本数据进行全文搜索。它可以帮助快速查找包含特定关键词或短语的文本。

  4. 空间索引:空间索引用于处理空间数据,如地理位置信息。它可以支持空间查询和操作,如距离计算和范围查询。

索引的优点

  1. 提高查询速度:通过使用索引,MySQL 可以快速定位到符合查询条件的数据行,从而减少查询时间。

  2. 减少磁盘 I/O 操作:索引可以减少数据库的磁盘 I/O 操作,因为 MySQL 可以使用索引快速定位到数据行,而不需要扫描整个表。

  3. 提高数据的唯一性:索引可以确保表中某一列或多列的值是唯一的,从而避免数据的重复。

索引的缺点

  1. 增加数据插入、更新和删除的时间:当向表中插入、更新或删除数据时,MySQL 需要同时更新索引,这会增加数据操作的时间。

  2. 占用磁盘空间:索引需要占用磁盘空间,因此在创建索引时需要考虑磁盘空间的限制。

  3. 降低查询的灵活性:索引可能会降低查询的灵活性,因为某些查询可能无法使用索引进行优化。

MySQL中使用 #{} 和 ${} 的区别

在MySQL中,#{} 和 ${} 是MyBatis框架中用于参数传递和SQL拼接的两种方式。

#{} 的使用:

#{} 用于参数传递:在SQL语句中,可以使用 #{} 来表示一个参数占位符,MyBatis会将传入的参数值安全地替换到 #{} 的位置上。这种方式可以有效地防止SQL注入攻击。

#{} 的特点:#{} 会将传入的参数值进行预编译,生成一个带有参数占位符的SQL语句,然后将参数值通过PreparedStatement设置到占位符上,从而保证了参数的安全性。

${} 的使用:

$${} 用于SQL拼接:在SQL语句中,可以使用$${} 来表示一个动态的SQL片段,MyBatis会将 ${} 替换为实际的值。这种方式可以用于拼接表名、列名等动态的SQL内容。

的特点: {} 的特点: 的特点:{} 不会对传入的参数进行预编译,而是直接将参数值替换到 ${} 的位置上。这种方式存在SQL注入的风险,因为参数值会直接拼接到SQL语句中。

mysql的数据类型,30用什么类型存,300,30000,3000000

在MySQL中,选择合适的数据类型来存储特定范围的数值对于优化存储空间、提高查询性能和保证数据准确性都非常重要。对于整数类型,MySQL提供了多种不同的数据类型,包括TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、和BIGINT。这些类型可以存储不同范围的整数值,并且每种类型都可以是有符号的或无符号的。

  • 30: 这是一个非常小的数值,可以使用TINYINT类型存储。TINYINT的范围是-128到127(有符号)或0到255(无符号)。因此,对于30这样的小数值,使用有符号或无符号的TINYINT都是合适的。

  • 300: 这个数值超出了TINYINT的范围,但可以使用SMALLINT类型存储。SMALLINT的范围是-32768到32767(有符号)或0到65535(无符号)。因此,300可以使用有符号或无符号的SMALLINT存储。

  • 30000: 这个数值可以使用SMALLINT类型存储(如果是无符号的),因为无符号的SMALLINT范围是0到65535。如果是有符号的情况,也可以考虑使用MEDIUMINT,其范围是-8388608到8388607(有符号)或0到16777215(无符号)。

  • 3000000: 这个数值超出了SMALLINT的范围,但可以使用MEDIUMINT或INT类型存储。考虑到范围和存储效率,MEDIUMINT是一个较好的选择,因为它足以存储这个数值,同时比INT使用更少的存储空间。

MySQL存储引擎之间的区别

  1. InnoDB:

    1. 支持事务处理,具有 ACID 特性(原子性、一致性、隔离性、持久性)。

    2. 行级锁定,提高并发性能。

    3. 支持外键约束,确保数据的完整性。

    4. 适用于对数据一致性和可靠性要求较高的应用,如电子商务、金融等。

  2. MyISAM:

    1. 不支持事务处理。

    2. 表级锁定,在写入操作时可能会出现性能瓶颈。

    3. 不支持外键约束。

    4. 适用于读操作频繁、对事务要求不高的应用,如日志记录、数据仓库等。

  3. MEMORY:

    1. 将数据存储在内存中,访问速度非常快。

    2. 不支持事务处理。

    3. 数据在服务器重启后会丢失。

    4. 适用于临时数据存储、缓存等场景。

  4. CSV:

    1. 以 CSV 格式存储数据,易于与其他应用程序进行数据交换。

    2. 不支持索引,查询性能较低。

    3. 适用于数据导入导出、简单的数据存储等场景。

  5. Archive:

    1. 用于存储大量的历史数据,只支持插入和查询操作。

    2. 压缩存储数据,节省存储空间。

    3. 不支持索引。

    4. 适用于数据归档、日志存储等场景。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值