MySQL优化

大批量插入数据优化

1.将数据按照id有序排列

2.使用load关键字(100万条:有序20s,无序1分50秒)

3.插入之前,关闭唯一性校验(SET UNIQUE_CHECKS=0),插完再打开(SET UNIQUE_CHECKS=1)唯一性校验。

4.关闭自动提交事务(SET AUTOCOMMIT=0),使用手动提交(SET AUTOCOMMIT=1)。

insert优化

原始方法:

#频繁的连接和关闭连接
insert into tb_test values(1,'Tom');
insert into tb_test values(2,'Cat');
insert into tb_test values(3,'Jack');

优化后:

#合并insert,只需要连接一次数据库
insert into tb_test values(1,'Tom'),(2,'Cat'),(3,'Jack');

在事务中进行数据插入。手动提交、有序插入

#开始事务
start transaction;
#插入数据 数据量大的情况下,分段提交(每1万条提交一次)
insert into tb_test values(1,'Tom');
insert into tb_test values(2,'Cat');
insert into tb_test values(3,'Jack');
#提交事务
commit

order by语句优化

排序方式:filesort(效率低)、index(效率高)

表名:emp

属性:id name age salary

加索引:create index idx_emp_age_salary on emp(age,salary);

#效率高 Using index
select id,age,salary from emp order by age;
#效率低 Using filesort
select id,age,salary,name from emp order by age;

因为:主键id默认有索引;age,salary加了索引;name没加索引;

索引的顺序是age,salary;所以:

#效率高 Using index					排序一致	顺序:age,salary
select id,age,salary from emp order by age desc,salary desc;
#效率低 Using index;Using filesort 排序一致 顺序:salary,age
select id,age,salary from emp order by salary desc,age desc;
#效率低 Using index;Using filesort 排序不一致
select id,age,salary from emp order by age desc,salary asc;

filesort的优化:

对于filesort,MySQL有两种排序算法:两次扫描算法、一次扫描算法;

一次扫描算法排序时内存开销较大,但是排序效率比两次扫描算法要高。

提升排序效率:提高 sort_buffer_size 和 max_length_for_sort_data

#查看命令
SHOW VARIABLES LIKE 'sort_buffer_size';
SHOW VARIABLES LIKE 'max_length_for_sort_data';

group by语句的优化

group by是在排序的基础上进行了分组操作。

方案:

#加索引
create index idx_emp_age_salary on emp(age,salary);
#去排序
order by null;

优化嵌套查询

方案:多表联查替换子查询

表:t_user、t_role、user_role

#原始语句
SELECT * FROM t_user WHERE id IN(SELECT user_id FROM user_role);
#优化后
SELECT * FROM t_user u,user_role ur WHERE u.id = ur.user_id;

优化or条件

建议使用union替换or

#原始语句	EXPLAIN查看执行计划
EXPLAIN SELECT * FROM emp WHERE id = 1 OR NAME = 'Tom';
#优化
EXPLAIN SELECT * FROM emp WHERE id = 1 OR id = 10;
#再优化
EXPLAIN SELECT * FROM emp WHERE id = 1 UNION SELECT * FROM emp WHERE id = 10;
#原始语句
EXPLAIN SELECT * FROM emp WHERE id = 1 OR age = 20;
#优化后
EXPLAIN SELECT * FROM emp WHERE id = 1 UNION SELECT * FROM emp WHERE age = 20;

优化分页查询

案例:

#查询总记录条数
SELECT COUNT(*) FROM tb_item;
#查询第1页,每页返回10条记录(limit 0,10)
SELECT * FROM tb_item limt 10;
#查询第2页,从第11条记录开始查询10条记录
SELECT * FROM tb_item limt 10,10;
#查询第3页,从第21条记录开始查询10条记录
SELECT * FROM tb_item limt 20,10; #查询第20万页,从第2000001条记录开始查询10条记录
#limit起始值较大,效率变低;
#因为要对前2000010条记录进行排序,然后丢弃前2000000条记录,只保留后10条
SELECT * FROM tb_item limt 2000000,10;

优化思路一

在索引上完成排序分页操作,最后根据主键关联回原表查询所需要的其他列内容。

#思路分析
#拿到的只有(2000011-2000020)条记录的id值
SELECT id FROM tb_item ORDER BY id LIMIT 2000000,10;
#再拿这些id去tb_item表里面去查数据
SELECT * FROM tb_item t,(SELECT id FROM tb_item ORDER BY id LIMIT 2000000,10) a WHERE t.id = a.id;
#原始语句
SELECT * FROM tb_item limt 2000000,10;
#优化后
SELECT * FROM tb_item t,(SELECT id FROM tb_item ORDER BY id LIMIT 2000000,10) a WHERE t.id = a.id;

优化思路二

该方案适用于主键自增(主键不能断层,如:1,2,3,4,5,8,9)的表,可以把Limit 查询转换成某个位置的查询 。

#原始语句
SELECT * FROM tb_item limt 2000000,10;
#优化后 查询id大于2000000的10条数据
SELECT * FROM tb_item WHERE id>2000000 LIMIT 10;

使用SQL提示

SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的。

案例:

#查看tb_seller表
SELECT * FROM tb_seller;
#查看索引
SHOW INDEX FROM tb_seller;
#创建单列索引
CREATE INDEX idx_seller_name ON tb_seller(NAME);
CREATE INDEX idx_seller_status ON tb_seller(STATUS);
CREATE INDEX idx_seller_address ON tb_seller(address);
#创建复合索引
CREATE INDEX idx_seller_name_sta_addr ON tb_seller(NAME,STATUS,address);

USE INDEX

使用某个索引,节省了比较索引步骤,帮助数据库选择索引。

use index是一种参考,建议数据库使用某个索引,并不是强制令其使用某个索引。

#原始语句
#可以使用的索引:idx_seller_name单列索引、idx_seller_name_sta_addr复合索引
#最终数据库经过比较索引,选择了idx_seller_name单列索引
EXPLAIN SELECT * FROM tb_seller WHERE NAME = '小米科技';
#改变索引:
#人为改变索引,令其使用idx_seller_name_sta_addr复合索引
#数据库只能使用idx_seller_name_sta_addr复合索引
EXPLAIN SELECT * FROM tb_seller USE INDEX(idx_seller_name_sta_addr) WHERE NAME = '小米科技';
#改变索引:
#人为改变索引,令其使用idx_seller_name单列索引
#数据库只能使用idx_seller_name单列索引
EXPLAIN SELECT * FROM tb_seller USE INDEX(idx_seller_name) WHERE NAME = '小米科技';

IGNORE INDEX

忽略某个索引,节省了比较索引步骤,帮助数据库选择索引。

#原始语句
EXPLAIN SELECT * FROM tb_seller WHERE NAME = '小米科技';
#忽略idx_seller_name单列索引,只能选择使用idx_seller_name_sta_addr复合索引
EXPLAIN SELECT * FROM tb_seller IGNORE INDEX(idx_seller_name) WHERE NAME = '小米科技';
#忽略idx_seller_name_sta_addr复合索引,只能选择使用idx_seller_name单列索引
EXPLAIN SELECT * FROM tb_seller IGNORE INDEX(idx_seller_name_sta_addr) WHERE NAME = '小米科技';

FORCE INDEX

强制使用某个索引。

#原始语句
#可能用到的索引:idx_seller_address
#实际上用到的索引:NULL
#原理:如果全表扫描比走索引还快,就不走索引
EXPLAIN SELECT * FROM tb_seller WHERE address = '北京市';
#人为改变索引,建议数据库使用idx_seller_address单列索引
#use index是一种参考,建议数据库使用某个索引,并不是强制令其使用某个索引。
EXPLAIN SELECT * FROM tb_seller USE INDEX(idx_seller_address) WHERE address = '北京市';
#force index强制数据库使用idx_seller_address单列索引
EXPLAIN SELECT * FROM tb_seller FORCE INDEX(idx_seller_address) WHERE address = '北京市';

MySQL数据库优化(2)的更多相关文章

  1. 关于MySQL数据库优化的部分整理

    在之前我写过一篇关于这个方面的文章 <[原创]为什么使用数据索引能提高效率?(本文针对mysql进行概述)(更新)> 这次,主要侧重点讲下两种常用存储引擎. 我们一般从两个方面进行MySQ ...

  2. 【MySQL】花10分钟阅读下MySQL数据库优化总结

    1.花10分钟阅读下MySQL数据库优化总结http://www.kuqin.com2.扩展阅读:数据库三范式http://www.cnblogs.com3.my.ini--->C:\Progr ...

  3. 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决(转载)

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  4. 50多条mysql数据库优化建议

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的.在非群集索引下,数据在物理上随机存 ...

  5. 解开发者之痛:中国移动MySQL数据库优化最佳实践(转)

    开源数据库MySQL比较容易碰到性能瓶颈,为此经常需要对MySQL数据库进行优化,而MySQL数据库优化需要运维DBA与相关开发共同参与,其中MySQL参数及服务器配置优化主要由运维DBA完成,开发则 ...

  6. 30多条mysql数据库优化方法【转】

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  7. 百万行mysql数据库优化和10G大文件上传方案

    百万行mysql数据库优化和10G大文件上传方案 最近这几天正在忙这个优化的方案,一直没时间耍,忙碌了一段时间终于还是拿下了这个项目?项目中不要每次都把程序上的问题,让mysql数据库来承担,它只是个 ...

  8. 从运维角度来分析mysql数据库优化的一些关键点【转】

    概述 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善. 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分 ...

  9. 关于mysql数据库优化

    关于mysql数据库优化 以我之愚见,数据库的优化在于优化存储和查询速度 目前主要的优化我认为是优化查询速度,查询速度快了,提高了用户的体验 我认为优化主要从两方面进行考虑, 优化数据库对象, 优化s ...

  10. mysql数据库优化 pt-query-digest使用

    mysql数据库优化 pt-query-digest使用 一.pt-query-digest工具简介 pt-query-digest是用于分析 mysql慢查询的一个工具,它可以分析binlog.Ge ...

随机推荐

  1. MySQL 插入中文后,显示为空白

    https://blog.csdn.net/sun_hj_95/article/details/79488583 在MySQL中插入中文后,显示如下: 解决方案: 在my.ini (在MySQL的安装 ...

  2. npm run start失败&Node.js 查询指定端口运行情况及终止占用端口办法

    缘由: node.js项目中运行npm run start命令脚本报错,No such file or directory 最开始以为是命令脚本找不到所谓的执行路径,但后面发现不是,是package. ...

  3. 【重学Java】多线程进阶(线程池、原子性、并发工具类)

    线程池 线程状态介绍 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态.线程对象在不同的时期有不同的状态.那么Java中的线程存在哪几种状态呢?Java中的线程 状态被定 ...

  4. python爬取北京政府信件信息02

    在爬取详细信息页面中,又遇到了问题,就是标签内的信息爬取,用re的正则表达式没有找到解决办法,只能又去网上搜索解决办法 用bs4来解决,用 soup = BeautifulSoup(text,&quo ...

  5. Java基础00-集合基础15

    1. 集合基础 1.1 集合概述 1.2 ArrayList构造方法和添加方法 代码示例: 想通过指定索引添加到最后一个位置的话就填写,现有索引的+1,比如3个索引就是4.如果在指定索引的位置添加没有 ...

  6. Java基础00-Debug11

    1. Debug 1.1 Debug概述 1.2 Debug操作流程 1.2.1 如何加断点 1.2.2 如何运行加了断点的程序 1.2.3 看哪里 1.2.4 点哪里 1.2.5 如何删除断点 多个 ...

  7. SLAM基础算法(1):卡尔曼滤波

    对于一个正在运动中的小车来说,如何准确的知道它所处的位置? 理论家说:我可以通过牛顿公式来计算! 实践家说:给它装个GPS不就得了! 好吧,你们说的听上去都很有道理,但我们到底该相信谁? 现实情况是: ...

  8. Spring框架中一个有用的小组件:Spring Retry

    1.概述 Spring Retry 是Spring框架中的一个组件, 它提供了自动重新调用失败操作的能力.这在错误可能是暂时发生的(如瞬时网络故障)的情况下很有帮助. 在本文中,我们将看到使用Spri ...

  9. [善用佳软]Chrome插件之彩云小译

    最近公众号新推出个栏目[善用佳软],旨在和大家分享各种小插件和制作开源小软件. 最近在浏览外网时,发现一个贼好用的翻译神器---[彩云小译],在网页端就可以快速的对照翻译出来,经过试用发现无论是速度还 ...

  10. Nodejs 处理异步(获取异步数据并处理)的方法

    方法1. 回调函数方式 将异步方法如readFile封装到一个自定义函数中,通过将异步方法得到的结果传给自定义方法的回调函数参数.具体如下(以fs模块的readFile方法为例): //封装 var ...