🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 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时,考虑先压缩数据