一、小表驱动大表:
in 后面加小表,exists后面加大表
语法:
SELECT …FROM table WHERE EXISTS(subquery)。
将主查询的数据放到子查询中做验证,根据验证结果(TRUE或者FALSE)来决定主查询的数据结果是否保留。
二、order by优化
系统有两种排序方式using filesort 和using index,
若索引不失效则采用后者否则采用前者,
1)索引是否失效遵循最左前缀原则,
2)必须排序索引顺序必须要按顺序,
3)升降序不能混用
4)where使用索引的最左前缀并且定义为常量,即where a=const order by b,c;
三、数据库锁理论:
表锁:(myisam)
1、读锁:针对同一份数据,多个读操作可以同时进行而不会相会影响,该会话只能读该表,不能修改该表,不能读写其他表,其他会话修改该表会被阻塞
2、写锁:当前操作没有完成前,会阻断其他写锁和读锁
,该会话只能读写该表,不能读写其他表,其他表不能读写该表
行锁:(innodb,支持事务,采用了行锁)
其中一个会话将自动提交取消,并且正在修改其中一行数据时,其他会话不能修改该行会被阻塞,但是可以修改其他行
索引失效会导致,行锁变表锁
间隙锁:
范围筛选的话,会将满足条件的索引项加锁,中间会存在不满足条件的间隙项,其他会话也不能操作该间隙项
锁定一行: