Mysql 笔记
myisam 和 innodb 区别
- innodb支持行锁,开销大,能解决脏读和不可重复读问题,myisam锁粒度为表锁
- innodb有事务日志,可以根据日志文件恢复
- innodb支持外键,
- MyISAM支持全文索引,InnoDB在MySQL 5.6及以上版本也开始支持全文索引。
- 对于读操作,MyISAM可能更快;对于写操作,尤其是并发写操作,InnoDB通常性能更好
Mysql 索引类型
- 主键索引:不允许重复,不为null,一个表只能有一个
- 唯一索引:不允许重复,可以为null,一个表可以有多个
- 普通索引:基本的索引类型,没有唯一性的限制,允许为 NULL 值
- 全文索引:
mysql 锁
- 共享锁:读锁,多个线程可以同时读,但只能有一个线程写
- 排他锁:写锁,只能有一个线程写,其他线程不能读或写
- 表锁
- 行锁
- 间隙锁
事务隔离级别
- 读未提交:读未提交,读到脏数据,可能读到其他事务未提交的数据
- 读已提交:读已提交,读到已提交的数据,但是可能读到其他事务未提交的数据
- 串行化:串行化,读到已提交的数据,并且不能读到其他事务未提交的数据
- 可重复读:可重复读,读到已提交的数据,并且不能读到其他事务未提交的数据
创建索引需要注意
- 最好用not null
- 离散度较大的列
- 常用于where查询条件的字段
- 索引字段值越小越好
SQL优化经验
- 尽量不要使用select *
- 尽量不要使用order by
- 尽量不要使用group by
- 尽量不要使用distinct
- where 条件不要使用函数
- explain查看执行计划
- 表尽量使用自增主键
- 尽量不使用not in ,!=符号
- 查询字段创建索引
- 大表分表
- 注意使用最左原则
- 避免使用大事务
- 字段尽量not null
- 选择合适字段类型