1. 表的设计优化
- 参考依据:参考阿里开发手册嵩山版,其中有很多关于MySQL表设计的内容。
- 类型选择:根据存储内容选择合适类型,如数值存储可选tinyint、bigint等,字符串可选varchar或text,根据内容长短选择合适类型可节省存储成本并提升查询效率。
2. SQL语句优化
- select语句:务必指名字段名称,避免使用
select *
,指明字段可能使用覆盖索引,性能更高,使用select *
可能造成回表查询。 - 避免索引失效写法:之前讲过五种索引失效情况,编写SQL语句时应尽量避免。
- union和union all:尽量使用union all代替union,union会多一次过滤操作,效率较低。例如union会合并结果并展示重复数据,union all则不会去重。
- 避免where子句表达式操作:避免在where子句中对字段进行表达式操作,否则可能导致索引失效。
- 连接优化:能用inner join就不要使用left join或right join;如果必须使用左连接和右连接,尽量以小表为驱动(写前面)。内连接会自动优化表顺序,优先把小表放外边,大表放里边,但left join和right join不会调整顺序,所以使用时要注意以小表为驱动,可通过循环类比理解,小循环放外层(类似小表)性能更好。
3. 主从复制和读写分离
- 适用场景:数据库读操作较多时,为避免写操作影响读操作,可使用读写分离架构。
- 架构原理:应用连接数据库中间件,包含主库master(负责写数据)和从库slave(负责读数据)。
写操作找主库,主库同步数据给从库;
读操作走从库,实现读写隔离,提高查询效率。
4. 分库分表
- 使用时机:一般在数据量特别大时,如一张表数据超过500万,可考虑分库分表,后续会详细讲解相关内容。
面试回答要点
- 提及从五个方面阐述SQL优化经验,分别是表的设计优化(参考阿里开发手册,如数据类型选择)、索引优化(参考创建索引原则和索引失效注意事项)、SQL语句优化(避免索引失效、不用
select *
、说明union和union all区别、小表驱动大表等)、主从复制和读写分离架构(避免写影响读,生产环境搭建主从库分开读写)、分库分表。