MySQL常见锁类型
-
共享锁(Shared Lock):也称为读锁,多个事务可以同时持有共享锁,用于读取数据。持有共享锁的事务不会阻塞其他事务获取共享锁,但会阻塞其他事务获取排他锁。
-
排他锁(Exclusive Lock):也称为写锁,只有一个事务可以持有排他锁,用于写入数据。持有排他锁的事务会阻塞其他事务获取共享锁和排他锁。
-
意向锁(Intention Lock):意向锁是一种表级锁,用于表示事务对表中的某些行或整个表的意向。意向锁分为意向共享锁和意向排他锁。意向共享锁表示事务有意向获取共享锁,意向排他锁表示事务有意向获取排他锁。意向锁的主要作用是提高锁的并发性能。
-
行锁(Row Lock):行锁是粒度最小的锁,用于锁定表中的一行数据。行锁可以提高并发性能,因为多个事务可以同时锁定不同的行。
-
表锁(Table Lock):表锁是粒度最大的锁,用于锁定整个表。表锁会阻塞其他事务对该表的所有操作,包括读取和写入。
MySQL中的意向锁的作用
意向锁的作用主要是提高并发性能和减少锁冲突。
一种表级锁,它表示事务在获取行锁或表锁之前,先获取的一种意向性的锁。
意向共享锁(IS 锁):表示事务有意向对表中的某些行加共享锁
意向排他锁(IX 锁):表示事务有意向对表中的某些行加排他锁
当一个事务请求获取行锁时,如果该事务已经获取了表上的意向锁,那么就可以直接获取行锁,而不需要再去检查表上是否有其他事务持有锁。这样可以避免在获取行锁时进行表级锁的检查,从而提高并发性能。
另外,意向锁还可以减少锁冲突。当一个事务请求获取表锁时,如果该事务已经获取了表上的意向锁,那么就可以直接获取表锁,而不需要再去检查表上是否有其他事务持有行锁。这样可以避免在获取表锁时进行行锁的检查,从而减少锁冲突。
MySQL数据库索引
索引是一种用于提高数据库查询性能的数据结构。
加快数据的检索速度,减少磁盘I/O操作,提高数据库的性能。
索引可以创建在表的一列或多列上。当创建索引时,MySQL 会对索引列的值进行排序,并将排序后的值存储在索引中。当查询数据时,MySQL 可以使用索引快速定位到符合条件的数据行,从而提高查询效率。
按索引的对象分
主键索引(Primary Key Index):用于唯一标识表中的每一行数据,主键索引是最常用的索引类型。
唯一索引(Unique Index):用于保证索引列的唯一性,一个表可以有多个唯一索引。
普通索引(Normal Index):也称为非唯一索引,用于加速查询操作。
组合索引(Composite Index):由多个列组合而成的索引,可以提高多列查询的性能。
按索引数据结构分
-
B 树索引:B 树是一种平衡的多路搜索树,适用于大多数数据库系统。B 树索引可以快速定位到特定的值或范围,并支持高效的插入、删除和更新操作。
-
哈希索引:哈希索引使用哈希函数将索引键映射到哈希表中的位置。哈希索引对于精确匹配查询非常高效,但对于范围查询和排序的支持相对较弱。
-
全文索引:全文索引用于对文本数据进行全文搜索。它可以帮助快速查找包含特定关键词或短语的文本。
-
空间索引:空间索引用于处理空间数据,如地理位置信息。它可以支持空间查询和操作,如距离计算和范围查询。
索引的优点
-
提高查询速度:通过使用索引,MySQL 可以快速定位到符合查询条件的数据行,从而减少查询时间。
-
减少磁盘 I/O 操作:索引可以减少数据库的磁盘 I/O 操作,因为 MySQL 可以使用索引快速定位到数据行,而不需要扫描整个表。
-
提高数据的唯一性:索引可以确保表中某一列或多列的值是唯一的,从而避免数据的重复。
索引的缺点
-
增加数据插入、更新和删除的时间:当向表中插入、更新或删除数据时,MySQL 需要同时更新索引,这会增加数据操作的时间。
-
占用磁盘空间:索引需要占用磁盘空间,因此在创建索引时需要考虑磁盘空间的限制。
-
降低查询的灵活性:索引可能会降低查询的灵活性,因为某些查询可能无法使用索引进行优化。
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存储引擎之间的区别
-
InnoDB:
-
支持事务处理,具有 ACID 特性(原子性、一致性、隔离性、持久性)。
-
行级锁定,提高并发性能。
-
支持外键约束,确保数据的完整性。
-
适用于对数据一致性和可靠性要求较高的应用,如电子商务、金融等。
-
-
MyISAM:
-
不支持事务处理。
-
表级锁定,在写入操作时可能会出现性能瓶颈。
-
不支持外键约束。
-
适用于读操作频繁、对事务要求不高的应用,如日志记录、数据仓库等。
-
-
MEMORY:
-
将数据存储在内存中,访问速度非常快。
-
不支持事务处理。
-
数据在服务器重启后会丢失。
-
适用于临时数据存储、缓存等场景。
-
-
CSV:
-
以 CSV 格式存储数据,易于与其他应用程序进行数据交换。
-
不支持索引,查询性能较低。
-
适用于数据导入导出、简单的数据存储等场景。
-
-
Archive:
-
用于存储大量的历史数据,只支持插入和查询操作。
-
压缩存储数据,节省存储空间。
-
不支持索引。
-
适用于数据归档、日志存储等场景。
-