(本文针对Innodb,如果有些的不对的地方,请在下面留言。。。)
Mysql是一种开放源代码的关系型数据库管理系统(RDBMS),使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。
mysql优化少不了sql优化,通常使用explain来查询执行计划。(本地测试数据,数据很少)
假设出现这种情况,最为常见的type类型:
system:系统表,少量数据,往往不需要进行磁盘IO;
const:常量连接;
eq_ref:主键索引(primary key)或者非空唯一索引(unique not null)等值扫描;
ref:非主键非唯一索引等值扫描;
range:范围扫描;
index:索引树扫描;
ALL:全表扫描(full table scan);
All全表扫描,效率最差,Extra:useing filesort 内部排序,很消耗内存。
这种情况,效率明显就很高, 用到索引,possible_key指可能用到的索引,key表示用到的索引。
这种情况没有上面的情况效率高,虽然说用到了索引,但是type类型是index级别的。Extra:Using index 指的是不用回表操作,用到索引覆盖。
回表:mysql分聚集索引和普通索引,一般主键为聚集索引,主键只能建一个;普通索引是非聚集索引,可以有多个;查找普通索引的时候是先根据普通索引找到主键再根据主键定位到数据,也就是数据是和主键一起存储的。
索引覆盖:简单的说,你查下的列正好是你见得索引的列,Extra:Using index,这会用到索引覆盖,会提高效率
最左匹配原则:复合索引,比如:name,age为索引,sql语句:select age,name from user where age= 10; 这没有用到索引;select age,name from user where name= ‘zhangs’;这会用到索引,这就是最左匹配原则;
索引下推:这是在mysql低版本的时候,才会出现的;比如name,age为索引,select age,name from user where name= ‘zhangs’ and age = 11;这个是时候mysql先会根据name进行查询,然后在mysql的server层进行age的数据筛选,如果数据量比较大的时候,会消耗内心,在mysl高版本的时候,5.6+,把这部分优化话了,直接查询name,age直接定位数据。
mysql行锁和表锁:行锁和表锁是对主键索引进行加锁。如果查询的表没有主键索引,会升级为表锁。
select * from user where id = 2 for update;会进行行的数据加锁。如果user表里面没有主键索引,会升级为表锁;
mysql事物隔离基本:未提交读(read uncommitted)、已提交读(read committed)、可重复读(repeatable read)、串行化(serializable),InnoDB默认级别:可重复读
隔离级别
脏读(Dirty Read)
不可重复读(NonRepeatable Read)
幻读(Phantom Read)
未提交读(Read uncommitted)
可能
可能
可能
已提交读(Read committed)
不可能
可能
可能
可重复读(Repeatable read)
不可能
不可能
可能
可串行化(Serializable )
不可能
不可能
不可能
mysql:redolog,undolog,binlog;
redolog:确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性
undolog:保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读
binlog:用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步
mysql:会存在一个版本控制器,即脏读,幻读,不可重复读,可重读,读的版本不一样。比如,脏读:两个线程同时开启事物,一个线程未提交事物,另一个线程提交事物,未提交数据的线程可以读取到另一个线程提交的事物,成为脏读,即读的是最新的版本。
(持续更新中.......)