一、选择引擎

1. MyISAM 引擎

MySQL5以前使用最多的引擎,数据读取的速度很快,适合读多写少的场景,但是不支持事务

所以为了数据的一致性,MyISAM引擎在写入数据的时候干脆锁表,不允许其他的并发写入,
但是如果要执行多条数据,想要一起回滚是不可能的,所以不具备事务的引擎很多使用场景是无法胜任的。

而且MyISAM引擎在服务器奔溃之后,维护的难度要比InnoDB引擎大很多。

正常MyISAM引擎的多条SQL是顺序执行的,需要配置才能插队执行,而InnoDB引擎没有规定优先级的关键字,这是因为InnoDB引擎允许并发读写,所以用不着配置去提升SQL执行的优先级。


2. InnoDB引擎

InnoDB引擎现在是MySQL默认的数据库引擎,InnoDBMySQL5以后引入的引擎,最大的特点是支持事务机制,
锁表变成了行锁,这样并发写入就好了很多,所以InnoDB引擎适合读多写多的场景使用。

而且InnoDB的综合维护成本,要比MyISAM引擎要低,所以所有上线的项目都建议使用InnoDB引擎。


3. TokuDB 引擎

TokuDB 只支持Linux系统,这个引擎很多人没听过。

InnoDB引擎单表超过2000万,那么这张表的读写速度就会明显的下降,
因此我们就要把表中不常用,过期的数据转移到归档表中,这样业务表的空间就腾出来了,读写速度也就恢复了。

归档表因为存储的数据量非常大,当我们归档的时候,是要向其顺时写入很多数据,TokuDB 引擎正好可以胜任。

同样在事务机制下,TokuDB引擎的写入速度是InnoDB引擎的920倍,数据的压缩比更是InnoDB14倍。

因为过期数据存放在归档表里面,很少被查找,所以用TokuDB这种写多读少的引擎存放,正好合适。

二、数据插入

1. IGNORE

当我们插入数据的时候,如果数据唯一键已经存在就会报错,都执行失败。

如果加上 IGNORE 关键字,就会忽略报错,把其余的都执行成功。

INSERT IGNORE INTO t_dept ( deptno, dname, loc )
VALUES
    ( 40, "企划部", "北京" ),
    ( 50, "培训部", "上海" ),
    ( 60, "后勤部", "北京" ),
    ( 70, "技术部", "北京" ),
    ( 80, "市场部", "北京" );

2. DUPLICATE KEY

使用DUPLICATE KEY,不存在就插入,存在就更新

INSERT INTO t_emp_ip ( id, empno, ip )
VALUES
    ( 5, 8004, "192.168.99.44" ),
    ( 6, 8005, "192.168.99.45" ),
    ( 7, 8006, "192.168.99.46" ),
    ( 8, 8001, "192.168.99.47" ) 
    ON DUPLICATE KEY UPDATE ip =
VALUES
    ( ip );

三、相关子查询

MySQL数据库默认关闭了缓存,所以每个子查询都是相关子查询

相关子查询就是要循环执行多次的子查询


使用FROM子查询替代WHERE子查询

FROM子查询只会执行一次, 所以不是相关子查询


四、JOIN的ON和WHERE

1. 内连接

内连接里,查询条件写在ON子句或者WHERE子句,效果相同


2. 外连接

外连接里,查询条件写在ON子句或者WHERE子句, 效果不同

当把条件写在ON后面,不会影响检索到的条数,因为只要左表有数据都查出来,右表查不到就以NULL代替

当把条件写在WHERE后面,查询到的行数就会根据条件而受到影响了


五、表连接数据更新

UPDATE语句中的WHERE子查询如何改成表连接?

这样每条需要UPDATE的语句,都需要进行一次相关子查询,效率低下

UPDATE 语句也是可以修改为连接语句的,这样就不会每次执行相关子查询了


六、表连接数据删除

DELETE e, d,这里的ed表明要删除的表,如果只想删除e,就不要写d