mysql 学习15 SQL优化,插入数据优化,主键优化,order by优化,group by 优化,limit 优化,count 优化,update 优化

插入数据优化,

insert 优化,

批量插入(一次不超过1000条)

手动提交事务

主键顺序插入

load 从本地一次插入大批量数据,

登陆时 mysql --local-infile -u root -p

load data local infile '/root/sql1.log' into table 'tb_user' fields terminated by ',' lines terminated by '\n';

从 '/root/sql1.log' 文件中,读取加载数据,加载数据到 tb_user 这个表,每个字段用 逗号分隔,每一行用 换行回车 分隔。

通过 select @@loacl_infile;查看是否打开可以批量插入数据的变量,

如果没有打开,则通过 set loacl_infile = 1; 打开该变量

主键优化,

我们看到 mysql innodb 中的 表数据 都是 根据主键顺序组织存放的。

page 是 innoDB的最小管理。

在主键顺序插入时,页中数据的形式

页分裂 - 在主键 乱序 插入时,页中数据可能会引起 页分裂

页合并

原始数据

依次删除 16,15,14,13 时

主键设计原则

主键长度 太长,辅助索引浪费更多的空间。

尽量顺序插入,选择使用 auto_incrment 避免 页分裂。

order by优化,

说白了,就是我们在 查询到数据后,在排序的时候使用order by 后面的字段 也是需要有 索引的。

如果排序后面的字段有索引,那么 explain select 执行后,extra 后面会提示 using index,表明我们的排序是使用的 索引完成的。

如果排序后面的字段没有索引,则extra后面的提示是 using filesort,表明排序没有使用索引。

测试,发现 extra 后面说明的 using index

创建age 和phone 的联合索引, 默认情况下 age和phone 都会按照 升序 排序。

如果我们像要让 age 按照 升序排序,让 phone 按照降序排序,则,按照如下的写法。

默认排序缓冲大小的值,在 变量 sort_buffer_size中存储。如果查询到的数据量就是很大,256k已经不够用了,默认mysql 就会在磁盘文件中开辟空间,I/O就会很慢。因此我们可以 改动 sort_buffer_size的大小,避免在 磁盘文件中开辟空间。

group by 优化,

limit 优化,

count 优化,

简单来说,count 优化是要自己计数的。

如果不优化,就使用count(*)计数,这个效率是最高的。

由于 id =24 没有专业,因此 select count(prefession) from tb_user的值是23

也就是说,如果按照字段计数,如果该字段为null,则不会计数。

update 优化

这是啥意思呢? 我们假设 student 表有3条记录

id name no

1 张三丰 2000100100

2 韦一笑 2000100105

3 度小满 2000100106

索引 只有 primary key = id,

我们有两个并行的事务,

一个按照id 更新 no,一个按照 name 更新 no

由于id 是有索引的,因此只会 锁定 id =1 的这一行,

但是name没有索引,会锁定 整张表,

也就是下面说的,innoDB的韩所是针对索引加的锁。

如果没有索引,会变成整张表的 锁。

应尽量避免将 整张表的锁。

这会让并行效率变的很低。

相关推荐
在未来等你6 小时前
SQL进阶之旅 Day 21:临时表与内存表应用
sql·mysql·postgresql·database·temporary-table·memory-table·sql-optimization
zhuiQiuMX6 小时前
分享今天做的力扣SQL题
sql·算法·leetcode
小Tomkk7 小时前
阿里云 RDS mysql 5.7 怎么 添加白名单 并链接数据库
数据库·mysql·阿里云
老纪的技术唠嗑局9 小时前
重剑无锋,大巧不工 —— OceanBase 中的 Nest Loop Join 使用技巧分享
数据库·sql
寒山李白9 小时前
MySQL复杂SQL(多表联查/子查询)详细讲解
sql·mysql·子查询·多表联查
冰橙子id9 小时前
centos7编译安装LNMP架构
mysql·nginx·架构·centos·php
玛奇玛丶10 小时前
面试官:千万级订单表新增字段怎么弄?
后端·mysql
nanzhuhe11 小时前
sql中group by使用场景
数据库·sql·数据挖掘
天天摸鱼的java工程师11 小时前
从被测试小姐姐追着怼到运维小哥点赞:我在项目管理系统的 MySQL 优化实战
java·后端·mysql
消失在人海中11 小时前
oracle sql 语句 优化方法
数据库·sql·oracle