事务的特点有:1、原子性 2、一致性 3、隔离性 4、持久性
原子性:事务是一个原子的操作单元,操作数据时,要么一起操作,要么一起失败; 一致性:在事务开始和完成时,数据始终保持一致的状态。 隔离性:事务与事务之间是相互独立的,互不干扰。 持久性:事务完成之后,对数据的修改是持久化的。
数据库的隔离级别有四种:(read uncommitted)读未提交、(read committed)读已提交(不可重复读)、(Repeatable Read 可重复读)Serializable(可串行化) MySQL的默认隔离级别是 (repeatable read 可重复读) Oracle/SQL Server数据库的默认隔离级别是(read committed 不可重复读)
脏读:A事务读取到了B事务已更新但未提交的数据,如果事务B回滚了,事务A读取到的数据就跟之前不一致了
不可重复读:A事务前后两次读取到的数据出现不一致的现象,A事务读取完第一次数据后,准备读取第二次时,期间有其他的事务对数据做了修改,导致A事务读取到的数据跟之前的不一致。
幻读:A事务读取到了B事务新增的数据,导致A事务读取前后两次的数据不一致。A事务第一次读取到的数据,在A事务准备第二次读取数据时,B事务插入了一些新增的数据。
非聚簇索引又称普通索引、唯一索引等。
单值索引:一个索引只包含一个列,一张表中可以有多个单值索引 多值索引:一个索引包含多个列
问题:哪些情况下不要创建索引
表记录太少经常增删改的表查看SQL的执行计划
通过explain+SQL语句可以查看sql的执行过程 如图: id:表示查询中执行select子句或操作表的顺序 id相同,执行顺序由上至下 id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行 id相同不同,同时存在,衍生:DERIVED
select_type:查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询 table:显示这一行的数据是关于哪些表的。 type显示的是访问类型,是较为重要的一个指标,结果值从最好到最坏依次是 system>const>eq_ref>ref>range>index>All possible_keys:显示可能应用在这张表中的索引,一个或多,但不一定被查询实际使用。 key:实际使用的索引。如果为NULL,则没有使用索引 key_len:表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好. ref:显示索引的哪一列被使用了 rows:根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数。 Extra:包含不适合在其他列中显示但十分重要的额外信息。 Using filesort:说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作成为“文件排序”。 Using temporary:使用了临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序order by和分组查询group by。 Using index:表示相应的select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错!
开启慢日志查询-设定一个阀值,超过这个阀真的sql会被记录到日志文件中,说明这是一条慢的sql,需要进行优化。
查看是否开启慢日志,默认是关闭的,如果不是调优需要,一般不建议开启 SHOW VARIABLES LIKE ‘%slow_query_log%’; 开启慢日志(使用这个命令,只会对当前数据库生效) set global slow_query_log=1; 查看当前数据库阀值的时间,默认是10s SHOW VARIABLES LIKE ‘long_query_time%’ 设置阀值时间 set global long_query_time=3; 查询当前系统中有多少条慢查询记录 show global status like ‘%Slow_queries%’;show profile查看 show profile:是mysql提供的可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优的测量,默认情况下,参数处于关闭状态,并保存最近15次的运行结果
查看当前mysql版本是否支持 show variables like ‘profiling’ 开启功能,默认是关闭的,使用前先开启 set profiling = on; 查看结果 show profiling; 诊断SQL,show profile cpu, block io for query [上一步(show profiling查询结果)SQL数字号码];
先看图形结构 一颗b+树,浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示) 如磁盘块1包含数据项17和35,包含指针P1,P2,P3 P1表示小于17的磁盘块,P2表示在17和35 之间的磁盘块,P3表示在大于35的磁盘块 真实的数据存放在b+树的叶子节点,3,5,9,10,13,15,28,29,36,60,75,79,90,99 非叶子节点不存储真实数据,只存储指引搜索方向的数据项,如17和35并不真实的存在于数据表中。
