索引是优化数据查询效率的一种数据结构;
insert优化:①批量插入 insert into tb_test values(1,‘Tom’),(2,‘Cat’),(3,‘June’)
②在事务中插入
start transaction;
insert into tb_test values (1,‘Tom’);
commit;
③有序插入,尽量按照主键的顺序插入
尽量使用多表联结查询来替换子查询
or优化:在or前后的字段都需要有索引,倘若有一方没有索引,则该语句整体不走索引;
可以使用union来替换or
select * from tb_test where id=1 union select * from tb_test where age=22
原子性(Atomicity):事务是一个不可分割的单位,是一个最小的操作单元;这个单元的操作要么全部成功,要么全部不成功。如果某一个SQL语句执行失败了,那么之前执行的SQL语句要执行回滚操作。实现原理:基于Undo log。Undo log会记录所有操作,一旦发生回滚,数据库就会按照Undo log做相反的操作,比如记录的是插入,那么数据库便会进行删除操作。
一致性(Consistency):事务执行之后,数据库的完整性约束没有被破坏,事务执行前后都是一个合法的数据状态。完整性体现在比如数据库的主键要唯一,字段类型大小要符合要求,外键的约束要符合要求。一致性是事务追求的最终目标。原子性、持久性、隔离性都是为了保证数据库最终的一致性。如果另外三个特性无法保证,那么一致性肯定也保证不了
隔离性(Isolation):写写操作:通过锁机制,保证当前只能有一个事务来操作某个数据。
持久性(Durability):实现原理:redo log。数据库除了要把数据写到Buffer中去,还会把内容记录到redo log里面,如果Mysql 宕机了,那么可以通过Redo log去恢复数据。Redo log是预写式日志,会把要进行的修改先写入到Redo log中,再更新到Buffer中。
为了解决以上问题引入了事务隔离级别
隔离级别 | 丢失更新 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
读未提交 | √(解决) | ×(未解决) | × | × |
读已提交 | √ | √ | × | × |
不可重复读 | √ | √ | √ | × |
串行化 | √ | √ | √ | √ |
mysql的默认事务隔离级别是:不可重复读
共享锁(只能读)
排它锁(可以读写)
间隙锁:用范围条件查询数据时,对于键值在条件范围内但不存在的记录,叫做‘间隙’,innodb也会对这个间隙加锁,这种加锁机制就是’'间隙锁"
比如 select * from tb where id <10
其中id=1,2,3,4,6,9;
对于id=5,7,8的则为间隙
1: 开启慢查询日志 slow_query_log=1
2: 设置慢查询日志文件名 slow_query_log_file=“文件名”
3: 设置时间限制 long_query_time=10 (默认10s)