小工具知识网

当前位置: 首页 > 行业知识 > Mysql的锁有哪些?超详细Mysql的锁介绍,表锁,行锁,间隙锁,临键锁,意向锁,元数据锁。Mysql数据库索引有哪些?从数据结构角度,从物理存储角度,从逻辑角度来分析

行业知识

Mysql的锁有哪些?超详细Mysql的锁介绍,表锁,行锁,间隙锁,临键锁,意向锁,元数据锁。Mysql数据库索引有哪些?从数据结构角度,从物理存储角度,从逻辑角度来分析

2026-11-11 19:44:26 来源:互联网转载

1.了解索引

1、���引是什么?

()

  在MySQL中,索引是一种增强式的存在,这表示即使没有索引,MySQL的功能并不会受到影响。索引是对数据库表中一列或多列的值进行排序的一种结构(B树),使用索引可快速访问数据库表中的特定信息。

2、为什么要使用索引?

()

就是提高查询性能。

3、有哪些索引?

主要分为聚集索引(CLUSTERED INDEX)和非聚集索引(NONCLUSTERED INDEX)两种,聚集索引指的是一列或多列的物理顺序和逻辑顺序是一致的,一个数据库表只能有一个聚集索引,我们通常将主键(一般为自增int型)设为聚集索引。而非聚集索引则可以有多个,而且非聚集索引并不会改变数据库表的物理结构。

2.Mysql有哪些索引?

2.1从数据结构角度

1.B+树索引:关于B+树索引参考

2.Hash索引:其检索效率非常高,索引的检索可以一次定位

3.FULLTEXT索引(现在MyISAM和InnoDB引擎都支持了)

4.R-Tree索引(用于对GIS数据类型创建SPATIAL索引)

2.2从物理存储角度

1.聚簇索引(主键索引)

2.非聚簇索引

2.3从逻辑角度

1、主键索引:主键索引是一种特殊的唯一索引,不允许有空值

2、普通索引或者单列索引

3、多列索引(复合索引):复合索引指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用复合索引时遵循最左前缀集合

4、唯一索引或者非唯一索引

5、空间索引:空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON。MYSQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引。创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MYISAM的表中创建

3.如何创建索引

普通索引 添加INDEX

ALTER TABLE table_name ADD INDEX index_name ( column )

主键索引 添加PRIMARY KEY

ALTER TABLE table_name ADD PRIMARY KEY ( column )

唯一索引 添加UNIQUE

ALTER TABLE table_name ADD UNIQUE ( column )

全文索引 添加FULLTEXT

ALTER TABLE table_name ADD FULLTEXT ( column)

如何添加多列索引

ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 )

4.Mysql有哪些锁

首先,mysql的锁可以按粒度来分

全局锁:粒度最大,锁定数据库中所有的表,锁住整个数据库实例,整个实例处于只读状态,阻塞ddl和dml语句,应用场景为做全库的逻辑备份,对所有表锁定,保证数据的完整性(flush tables with read lock,执行数据备份 mysqldump ,unlock tables释放)或者用--single transaction

表级锁:粒度大,并发度最小,锁住整个表

表锁:lock tables 表明... read/write ,unlock tables

表读锁:

表写锁:

元数据锁:避免DML与DDL冲突,保证数据的准确性

增删改查时MDL读锁(共享):select,select...lock in share mode 加SHARED_READ锁

insert,update,delete,select...for update加SHARED_WRITE锁

这两种都是兼容的

修改表结构时会加MDL写锁(排他) alter table... 加EXCLUSIVE锁 与上面两个互斥

意向锁:线程1增删改查添加了行锁,线程2来的时候想加表锁,这是行锁和表锁是不兼容的,若是没有意向锁,线程2会一行一行的去 判断是否有行锁,而意向锁就能解决这个问题

意向共享锁:select...lock in share mode ,与表锁共享锁兼容,与表锁排他锁互斥。

意向排他锁:DML语句和for update时添加,与表锁共享排他都互斥,意向锁之间不会互斥

行级锁:粒度最小,并发度高,锁住一行数据

select不加锁,select ...lock inshare mode共享行锁,其他DML和for update都加排他锁

行锁:锁住一行数据,在索引上才能加锁,非索引会升级为表级锁

间隙锁:锁住两个数据之间的数据,

临键锁:行锁+间隙锁

间隙锁和临间锁在RR隔离级别下解决幻读

唯一索引的等值查询,给不存在的一行记录加锁时,会优化为间隙锁

普通索引的等值查询,向右遍历时,第一个不满足查询需求时,临键锁退化为间隙锁 2,5, 8,11,当给8加锁时,由于普通索引能有多个,所以8的前后都有可能出现8,这是会给8加行锁,5-8,8-11加间隙锁;

唯一索引的范围查询,>=5,会给5加行锁,(5,8]临键锁,(8,11]临键锁,(11,∞)

还能分为:

共享锁:也就是读锁,其他事务只可以读不可以写

排他锁:写锁,其他事务不能读也不能写

  • 读锁:在需要读取数据时,会话可以使用"SELECT"语句对数据表或数据行加上读锁,通过"LOCK IN SHARE MODE"来获取读锁。

  • 写锁:在需要修改数据时,会话可以使用"INSERT"、"UPDATE"、"DELETE"语句对数据表或数据行加上写锁,通过"FOR UPDATE"来获取写锁。

    还能分:

    乐观锁:并不会加锁,二手通过版本号来实现

    悲观锁:行锁,表锁

上一篇:诛仙老版服务器怎么进去?

下一篇:揭秘主机名真相,轻松获取核心信息秘籍!