## MySQL专题五:sql优化
[TOC]
> 本文主要讨论在数据库等级上的优化方法,参考[数据库等级上优化](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/optimize-overview.html)
### 5.1.SQL语句[优化](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/statement-optimization.html)
#### 5.1.1. 查询SELECT语句优化
- 对`WHERE`子句中的Column考虑是否可以添加索引Index
- 使用LIKE子句时,避免使用通配符`%`作为字符串常量的开始,`LIKE %fun%`
#### 5.1.2. 插入INSERT语句优化
- 插入多条记录时,使用多个VALUES列表一次插入,代替多条插入语句
如下面:
VALUES列表插入
~~~
INSERT INTO table0 ( field1, field2 )
VALUES
( value1, value2),
( value2, value3);
~~~
多条插入语句
~~~
INSERT INTO table0 ( field1, field2 )
VALUES ( value1, value2);
~~~
~~~
INSERT INTO table0 ( field1, field2 )
VALUES ( value2, value3);
~~~
- 从文本文件向表中插入数据时,使用[LOAD DATA](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/load-data.html),而不是插入[INSERT](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/insert.html)语句
- 列多使用缺省值,减少了MYSQL的转换,仅当要插入的值与默认值不同时才显式插入值
#### 5.1.3. 更新UPDATE语句优化
- 延迟更新,一次执行多个更新
### 5.2. 索引[优化](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/optimization-indexes.html)
建立索引加快了数据查询的速度,如果一个索引都没有,查询一个数据就得**全表查找**,从表中第一个记录查找,知道找到满足条件的记录或者到表中最后一个记录也没有找到满足条件的记录,全表查找时间随着表的记录增长会越来越长。
同时数据的插入、更新、删除操作,索引都需要更新,因此需要找到一个平衡点,实现最佳索引查询。
#### 5.2.1. Primary Key优化
Mysql默认会为Primary Key的Column建立索引
- 考虑重要字段作为主键
- 如果没有明显重要字段,考虑创建一个单独的列并使用自动增长值作为主键
#### 5.2.2. Foreign Key优化
- 如果一张表中列很多,考虑将表中不常用的数据分离成一张或多张单独的分表,并将主表中的主键复制到分表中。
### 5.3. 数据库结构[优化](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/optimizing-database-structure.html)
- 尽可能使用最小的数据类型,如MEDIUMINT通常是比INT更好的选择,因为MEDIUMINT列使用的空间减少了25%
- 尽可能声明列不为空,使用默认值代替
- 对于可以表示为字符串或数字的唯一id或其他值,首选的应该是数字列而不是字符串列
- 对于大小小于8KB的列值,请使用VARCHAR而不是BLOB
- 在InnoDB表中使用随机生成的值作为主键时,如果可能的话,在它前面加上一个升序值,例如当前日期和时间。当连续的主值物理存储在彼此附近时,InnoDB可以更快地插入和检索它们
- 存储包含文本数据的大blob时,考虑先压缩数据
- JavaCook
- Java专题零:类的继承
- Java专题一:数据类型
- Java专题二:相等与比较
- Java专题三:集合
- Java专题四:异常
- Java专题五:遍历与迭代
- Java专题六:运算符
- Java专题七:正则表达式
- Java专题八:泛型
- Java专题九:反射
- Java专题九(1):反射
- Java专题九(2):动态代理
- Java专题十:日期与时间
- Java专题十一:IO与NIO
- Java专题十一(1):IO
- Java专题十一(2):NIO
- Java专题十二:网络
- Java专题十三:并发编程
- Java专题十三(1):线程与线程池
- Java专题十三(2):线程安全与同步
- Java专题十三(3):内存模型、volatile、ThreadLocal
- Java专题十四:JDBC
- Java专题十五:日志
- Java专题十六:定时任务
- Java专题十七:JavaMail
- Java专题十八:注解
- Java专题十九:浅拷贝与深拷贝
- Java专题二十:设计模式
- Java专题二十一:序列化与反序列化
- 附加专题一:MySQL
- MySQL专题零:简介
- MySQL专题一:安装与连接
- MySQL专题二:DDL与DML语法
- MySQL专题三:工作原理
- MySQL专题四:InnoDB存储引擎
- MySQL专题五:sql优化
- MySQL专题六:数据类型
- 附加专题二:Mybatis
- Mybatis专题零:简介
- Mybatis专题一:配置文件
- Mybatis专题二:映射文件
- Mybatis专题三:动态SQL
- Mybatis专题四:源码解析
- 附加专题三:Web编程
- Web专题零:HTTP协议
- Web专题一:Servlet
- Web专题二:Cookie与Session
- 附加专题四:Redis
- Redis专题一:数据类型
- Redis专题二:事务
- Redis专题三:key的过期
- Redis专题四:消息队列
- Redis专题五:持久化