left join,right join,inner join,select in
最基本的sql语句,连表查询性能并没有想得那么差。尽量避免大表连小表的操作。
锁
mysql的锁有很多类,主要区别在于两点
- 锁粒度
- 互斥性
mysql有一下几类锁
- Shared and Exclusive Locks:读写锁
- Intention Locks:意向锁:表或者行级别锁
- SELECT … LOCK IN SHARE MODE IS锁。读锁
- SELECT … FOR UPDATE IX锁。写锁
- 行级锁:用于锁定某一行数据,粒度
- gap索引: 范围锁,a gap between index records, or a lock on the gap before the first or after the last index record。在read_repeatable级别有效,read_commited无效
- Next-Key Locks: 行锁+gap锁,在read_repeatable级别有效,read_commited无效
- Insert Intention Locks: 插入索引
事务
- 隔离级别
- READ UNCOMMITTED
- READ COMMITTED 阿里云默认,性能好些。不适用gap锁。在扫描数据的时候,会自动释放不符合条件的行锁
- REPEATABLE READ innodb默认级别,mvcc,使用next-key lock
- SERIALIZABLE 串行化
- Locking Reads
- share mode:SELECT … LOCK IN SHARE MODE。共享读锁
- exclusive mode:SELECT … FOR UPDATE。排他锁
- 隔离级别
索引:
- 聚簇索引:索引和数据一起存储,读取效率高
- 二级索引:存储聚簇索引,读两次磁盘
- 主键uuid vs auto_increment bigint:二级索引存的是主键值,uuid太大。读取磁盘速度慢。索引不连续