MYSQL之SQL优化

一 插入数据(insert优化)

批量插入

手动提交事务

把自动提交给关闭,如下指令

set autocommit = 0;

主键顺序插入

大批量插入数据

如果需要大批量插入数据,使用insert语句插入性能较低,此时可以使用load指令插入。操作如下

二 主键优化

innodb逻辑存储结构

数据组织方式

在InnoDB存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表

页分裂

页可以为空,也可以填充一半。也可以填充100%。每个页中至少包含两行数据(如果一行数据过大,就会出现行溢出现象)

顺序插入如下图所示

乱序插入

第一步从表的50%分裂建立一个新表

第二步 将分裂后的数据和原表中的50%数据放入新表

页合并

当删除一行记录时,实际上记录并没有被物理删除,只是被标记(flaged)为删除并且它的空间变得允许被其他记录声明并使用。当页中删除的记录达到MERGE_THRESHOLD(默认为页的50%),在InnoDB开始寻找最靠近的页(前或者后)看看是否可以将两个页合并并优化空间使用。

notes:MERGE_THRESHOLD合并页的阈值,可以自己设置,在创建表或者创建索引时指定

主键设计原则

1、满足业务需求的情况下,尽量降低主键的长度。(索引时,主键长度过长,占用的io就大)

2、插入顺序时尽量顺序插入,选择使用auto_increase自增主键(防止页分裂次数过多)。

三 order by优化

1、Using filesort:通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所以只要不是通过索引排序直接返回结果的排序都叫FileSort排序。

2、Using index:通过有序索引顺序扫描直接返回有序数据,这种情况即为using index不需要额外排序,操作效率高。

优化原则

1、根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则。

2、尽量使用覆盖索引。

3、多字段排序,一个升序一个降序,此时需要注意联合索引在创建时的规则(asc desc)

4、如果不可避免的出现file sort,大数据量排序时(缓冲区不够用的话会在磁盘排序,效率很慢),此时可以适当增大排序缓冲区大小sort_buffer_size(默认256k)

四 group by优化

五 limit 优化

六 count优化

七 update优化

相关推荐
小陈工4 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
0xDevNull8 小时前
MySQL数据冷热分离详解
后端·mysql
科技小花8 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸8 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain8 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希9 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神9 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员9 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java9 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿10 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb