一、四种隔离级别
Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
Repeatable read (可重复读):可避免脏读、不可重复读的发生。
Read committed (读已提交):可避免脏读的发生。
Read uncommitted (读未提交):最低级别,任何情况都无法保证。
脏读:事务a读取到事务b更新的数据,b回滚,a就读到的数据是脏数据
不可重复读:事务a多次读取数据时,在事务a读取过程中,事务b多次对数据进行更新,使事务a读取到的数据不一致
幻读:事务a前后两次查询统一范围的数据,后一次查询到前一次没有的数据
二、mysql表优化
1、对表设置主键
2、部分字段使用 enum 代替 varchar ,比如 性别
3、对经常使用的字段加索引
4、可使用varchar 代替 char ,因为varchar会动态分配长度,char是固定长度
5、在表中,应尽量设置默认自,避免字段为null
6、对于大字段,使用独立表进行存储
7、对经常新增 修改的表,减少索引
8、垂直查分表,将常用字段放在一张表,不常用的放在另一张表
三、mysql语句优化
1、where 子句中 避免使用 or != <>,会放弃使用索引,进行全表查询
2、在查询部分数据数使用limit ,比如limit 10 会查询到10条数据后停止搜索,不会继续查询剩下的数据
3、使用join代替子查询
4、避免全表查询,在order by 和where 后面的字段加索引
5、避免在where 字句中使用 null,会放弃索引,全表查询
6、应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描
7、in 、not in 会全表查询
8、应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
9、应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描
10、不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
四、mysql事务的基本特性:
原子性:一个事务,一定是不可分割的最小的工作单位,要么提交成功,要么失败,不可能成功一部分。
隔离性:每一个事务在最终提交前,是不可见的
持久性:事务成功提交后,数据库的修改是一直存在的,数据保存到数据库,不会丢失
一致性:数据库重一个一致性状态,变到另一个一致性状态
五、MySQL中myisam与innodb的区别
(1)、innoDB 与 myisam 的区别:
1、innoDB支持事务,myisam不支持事务
2、innoDB支持行级锁,myisam支持表级锁
3、innoDB支持外键,myisam不支持
4、innoDB不支持全文索引,myisam支持。
5、innoDb支持mvcc,myisam不支持
6、innoDb支持多种行格式,myisam不是
7、innoDb是索引组织表,myisam不是
8、innoDB不能直接copy表文件到另一台机器,myisam可以
(2)、innodb引擎的4大特性
1、插入缓存
2、二次写
3、自适应哈希索引
4、预读
六、如何使用explain优化sql和索引?
explain sql ;
id:每个被独立执行的操作的标志,表示对象被操作的顺序。一般来说, id 值大,先被执行;如果 id 值相同,则顺序从上到下。
select_type:查询中每个 select 子句的类型。
table:显示这一行的数据是关于哪张表的;
partitions:匹配的分区信息。
type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、index和ALL
all: full table scan ;MySQL将遍历全表以找到匹配的行;
index : index scan; index 和 all的区别在于index类型只遍历索引;
range:索引范围扫描,对索引的扫描开始于某一点,返回匹配值的行,常见与between ,< ,>等查询;
ref:非唯一性索引扫描,返回匹配某个单独值的所有行,常见于使用非唯一索引即唯一索引的非唯一前缀进行查找;
eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常用于主键或者唯一索引扫描;
const,system:当MySQL对某查询某部分进行优化,并转为一个常量时,使用这些访问类型;如果将主键置于where列表中,MySQL就能将该查询转化为一个常量;
possible_keys;显示可能应用在这张表中的索引;如果为空,没有可能的索引;可以为相关的域从WHERE语句中选择一个合适的语句;
key:实际使用的索引;如果为NULL,则没有使用索引;很少的情况下,MySQL会选择优化不足的索引;这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MySQL忽略索引
key_len:使用的索引的长度;在不损失精确性的情况下,长度越短越好
ref:显示索引的哪一列被使用了,如果可能的话,是一个常数
rows:MySQL认为必须检查的用来返回请求数据的行数
filtered:rows*filtered/100 表示该步骤最后得到的行数(估计值)。
extra:重要的补充信息。