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

    2025-10-15 02:37:43

    目录

    1.了解索引

    1、索引是什么?

    2、为什么要使用索引?

    3、有哪些索引?

    2.Mysql有哪些索引?

    2.1从数据结构角度

    2.2从物理存储角度

    2.3从逻辑角度

    3.如何创建索引

    4.Mysql有哪些锁

    MySQL索引优化,MySQL索引失效的场景(超详细!)

    MySQL索引优化,MySQL索引失效的场景(超详细!)

    MySQL索引优化,MySQL索引失效的场景(超详细!)

    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"来获取写锁。

    还能分:

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

    悲观锁:行锁,表锁