首页 > 数据库 >mysql 一些优化参数

mysql 一些优化参数

时间:2023-11-24 12:12:56浏览次数:37  
标签:sort name -- into 索引 参数 mysql 排序 优化

 

大批量数据加载优化
load数据加载
格式:

load data local infile '文件路径' into table 表名 fields terminated by '[分隔符]' line terminated by '[换行符]'
1
1、 首先,检测全局变量‘local_infile’的状态,如果是off状态则是不可用

show global variables like 'local_infile';
1
2、 修改local_infile值为on,开启local_infile

set global local_infile=1;
1
3、 加载数据
当通过load向表数据加载时,尽量保证文件中的主键是有序的。

关闭唯一性校验
如果表中有唯一索引,如果有唯一索引在导入的时候 每一行都会做校验,会影响加载数据。
插入完成后再打开创建唯一索引。

set UNIQUE_CHECKS=0; -- 0 or 1
1
insert插入数据优化
如果需要同时对一张表插入多行数据,尽量使用多个值表的insert语句,这种方式将缩减用户端与服务器之间的连接、关闭消耗,比单个insert into语句执行效率高。
单个insert into每次插入都会执行一次连接关闭操作。

-- 原始方式
insert into tb_name value(1,'value1');
insert into tb_name value(2,'value1');
insert into tb_name value(3,'value1');
-- 优化方式
insert into tb_name values(1, 'valu1'), (2, 'value2'),(3,'value3');
1
2
3
4
5
6
在事务中进行数据优化
在事务中数据插入,需要手动提交,不然每一次插入都会触发自动提交事务,频繁开启提交事务

begin
insert into tb_name value(1, 'value1');
insert into tb_name value(2,'value2');
commit;
1
2
3
4
数据有序插入
在插入数据的时候,如果有主键ID,数据的顺序尽量是有序的,这样表在构建索引的时候 将大大减少构建时间。

Order by 优化
两种排序方式
第一种是通过对返回数据进行排序,也就是通常说的filesort排序,所有不是通过索引直接返回排序结果的排序都叫filesort排序
第二种是通过有序索引顺序扫描直接返回有序数据,这种情况即为using index,不需要额外排序,操作效率高
-- 创建索引
alter table emp add index idx_depid(department);

-- 效率低 排序字段虽然有索引,但使用的select *所有,所以排序的时候并没有使用到索引字段
explain select * from emp order by department; -- Using filesort

-- 效率高 查询字段即索引字段
explain select department from emp order by department; -- Using index

-- 效率低 查询字段排序方式中有非索引字段
explain select department,emp_name from emp order by department; -- Using filesort
1
2
3
4
5
6
7
8
9
10
11


order by 后边的多个排序字段尽量排序方式相同
order by 后边的多个排序字段尽量和索引字段顺序相同
Filesort的优化
通过创建合适的索引,能够减少filesort的出现,但在某些情况下不可避免的会使用到filesort。
对filesort,MySql有两种排序算法:

两次扫描算法:
MySql4.1之前,使用该方式排序。首先根据条件取出排序字段和行指针信息,然后在排序区sort buffer中排序,如果sort buff不够,则在临时表中temporary table中存储排序结果。完成排序之后,再根据行指针回表读取记录,该操作可能会导致大量随机i/o操作。
一次扫描算法
一次性取出满足条件的所有字段,然后在排序区sort buffer中排序后直接输出结果集。排序时内存开销较大,但是排序效率比两次扫描算法更高。
MySql通过比较系统变量max_length_for_sort_data的大小和Query语句取出的字段总大小,来判定是否采用哪种算法,如果max_length_for_sort_data更大,那么使用第二种优化之后的算法,否则使用第一种。
可以适当的提高sort_buffer_size和max_length_for_sort_data系统变量,来增大排序区的大小,提高排序的效率。

show variables like 'max_length_for_sort_data'; -- 默认4096
show variables like 'sort_buffer_size'; -- 默认262144
1
2
子查询优化
多表连接查询优于子查询,因为MySql不需要在内存中创建临时表来完成这个逻辑(子查询会创建临时表,再从临时表中读取数据)。
非特殊情况尽量使用多表连接查询。
system > const > eq_ref > ref > range > index > all

limit 查询优化
一般分页查询时,通过创建覆盖索引能够很好的提高性能。
一个常见非常头疼的问题就是limit 900000, 10, 此时需要MySql排序前900000 - 900010的记录,其它记录丢弃,查询排序的代价非常大。

优化思路一:
在索引上完成排序分页操作,最后根据主键关联回原表查询所需要的其它列内容
-- 先主键ID排序再使用limit
select * from table_name a, (select id from table_name order by id limit 900000, 10) b where a.id = b.id;
1
2
优化思路二:
该文案适用于主键自增的表,可以把limit查询转换成某个位置的查询
先使用主键索引快速排序筛选出数据
select * from table_name where id > 90000 limit 10;

标签:sort,name,--,into,索引,参数,mysql,排序,优化
From: https://www.cnblogs.com/ruiy/p/17853443.html

相关文章

  • Centos系统udp丢包&内核参数优化
    echo0>/proc/irq/31/smp_affinity_listecho1>/proc/irq/33/smp_affinity_list这两个命令是用于设置Linux中中断处理程序的亲和性,以提高系统的性能和稳定性。在Linux系统中,系统中断(IRQ)是由硬件触发的,它们通常被用于处理来自硬件设备的请求(例如,网络接口卡、磁盘控制器......
  • mapper中limit参数的问题
    通常情况下一般不会用limit进行分页操作,但是在数据量小的情况下使用limit还是挺好的,因为方便。在mapper中操作一般我们都是这样写,看起来没问题,但是跑起来会有问题。因为limit中不支持动态运算符,故在写分页的时候mapper.xml中以下这种写法是错误的://错误写法<selectid="queryPag......
  • mysql数据库物理及逻辑备份
    一、理论知识1.1:物理备份备份数据库操作系统的物理文件(数据文件、日志文件等):冷备份(脱机备份):关闭数据库进行热备份(联机备份):数据库正运行,依赖数据库的日志文件温备份:数据库锁定表格(可读不可写)后进行常见方法:物理冷备:拷贝数据库文件打包备份,需进行锁表-备份-解表。恢复时拷......
  • MySQL大表设计怎么做?
    MySQL是一种常用的关系型数据库管理系统,它在处理大表时需要特别注意设计和优化。下面将详细介绍MySQL大表的设计原则和优化策略。1.数据库设计数据库范式化:将数据按照规范的关系模型进行拆分和组织,避免数据冗余和更新异常。合理选择主键:选择适合业务需求的主键类型,并确保主键......
  • cocos creator新手入门教程:如何绑定参数到编辑器
    很多cocoscreator同学不知道如何绑定组件属性到编辑器上,今天我们来教大家如何绑定1:基本数据属性绑定到编辑器这个非常简单,模板是属性名字:默认的值;Is_debug:false,speed:100,2:系统组件类型与节点绑定到编辑器属性名字:{type:组件类型(cc.Sprite,cc.Label,cc.......
  • js 优化
    提炼函数把条件分支语句提炼成函数合理使用循环提前让函数退出代替嵌套条件分支传递对象参数代替过长的参数列表少用三目运算符合理使用链式调用分解大型类活用位操作符纯函数(1).提炼函数:①.避免超大函数.②.独立出来的函数有助于代码复用.③.独立出来的函数更容......
  • MySQL_基础
    MySQL架构Server层:建立连接、分析和执行SQL存储引擎层:数据的存储和提取。不同的存储引擎共用一个Server层。1a.连接器:与客户端三次握手建立TCP连接->-u-p错误,报错->正确,读取用户的权限,后面的权限逻辑判断基于此时读取到的权限。1b.查询缓存:MySQL8.0后将缓存......
  • nuxt3构建优化
    1.性能分析network分析 Lighthouse分析利用浏览器的Lighthouse工具不仅能够了解到首屏渲染速度等信息,并还能提供相应优化建议   Bundle分析    在nuxt3不需要自行下载第三方依赖也能够进行Bundle分析 配置:在nuxt.config.ts下写入exportdefaultdefi......
  • MySQL中count()、sum()区别
    1、count0函数里面的参数是列名的的时候,会计算有值项的次数sum(函数里面的参数是列名的时候,会计算列名的值的和。2、两个函数在记录的列名的值为空或者是null时,都不会去统计即count(列名)和sum(列名)都不计入这条记录3、count()可以计算出行数,count(1)也可以计算出行数、1......
  • Volatile(编译优化阶段)
    作用:告诉编译器该变量是容易发生变化的,不能对该变量进行优化,每次取值都必须从内存中取值而不是直接去取之前在寄存器中的值例子:Volatileinta=20,b,c;b=a;C=a;代码执行流程如下;B=a;先从a的内存中取值存放到寄存器,再把寄存器的值给存到b的内存C=a;把寄存器的值给存到b的......