Mysql的锁有哪些?超详细Mysql的锁介绍,表锁,行锁,间隙锁,临键锁,意向锁,元数据锁。Mysql数据库索引有哪些?从数据结构角度,从物理存储角度,从逻辑角度来分析
目录
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"来获取写锁。
还能分:
乐观锁:并不会加锁,二手通过版本号来实现
悲观锁:行锁,表锁