博客
关于我
MySQL高级-SQL优化
阅读量:789 次
发布时间:2023-02-13

本文共 2437 字,大约阅读时间需要 8 分钟。

SQL 优化

1. 大批量插入数据

环境准备

创建数据库表 tb_user_2,结构如下:

CREATE TABLE `tb_user_2` (    `id` int(11) NOT NULL AUTO_INCREMENT,    `username` varchar(45) NOT NULL,    `password` varchar(96) NOT NULL,    `name` varchar(45) NOT NULL,    `birthday` datetime DEFAULT NULL,    `sex` char(1) DEFAULT NULL,    `email` varchar(45) DEFAULT NULL,    `phone` varchar(45) DEFAULT NULL,    `qq` varchar(32) DEFAULT NULL,    `status` varchar(32) NOT NULL COMMENT '用户状态',    `create_time` datetime NOT NULL,    `update_time` datetime DEFAULT NULL,    PRIMARY KEY (`id`),    UNIQUE KEY `unique_user_username` (`username`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

导入数据优化

使用 LOAD DATA INFILE 命令导入数据,建议:

  • 按主键顺序插入:InnoDB 表按主键顺序存储数据,按顺序插入可提高效率。
  • 关闭唯一性校验:执行 SET UNIQUE_CHECKS=0,导入结束后恢复为 1
  • 手动提交事务:关闭自动提交,执行 SET AUTOCOMMIT=0,导入完成后恢复为 1

示例

# 有序插入insert into tb_user_2 values(1,'Tom'),(2,'Cat'),(3,'Jerry');# 无序插入insert into tb_user_2 values(3,'Luci'),(1,'Tom'),(2,'Cat');

2. 优化 INSERT 语句

  • 多值插入:将多个插入合并为一条语句,减少客户端连接次数。
  • 事务化插入:使用 START TRANSACTIONCOMMIT 控制事务,提升效率。

示例

# 原始方式insert into tb_test values(1,'Tom');insert into tb_test values(2,'Cat');insert into tb_test values(3,'Jerry');# 优化后insert into tb_test values(1,'Tom'),(2,'Cat'),(3,'Jerry');

3. 优化 ORDER BY 语句

3.1 环境准备

创建表 emp 和索引 idx_emp_age_salary

CREATE INDEX idx_emp_age_salary ON emp(age, salary);

3.2 排序优化

  • 使用索引排序:确保 ORDER BYWHERE 中的字段一致,并按升序或降序排序。
  • 避免 Filesort:通过合理设计索引,减少排序开销。

3.3 Filesort 优化

  • 排序算法:使用一次扫描算法(默认优化)。
  • 优化参数:调整 sort_buffer_sizemax_length_for_sort_data

4. 优化 GROUP BY 语句

  • 避免 Filesort:在 GROUP BY 中禁用排序,执行 ORDER BY NULL
  • 使用索引:确保 GROUP BYWHERE 中的字段有优化索引。

示例

# 需要 Filesortselect age, count(*) from emp group by age;# 禁用 Filesortselect age, count(*) from emp group by age order by null;

5. 优化嵌套查询

  • 替换子查询:使用多表连接替代嵌套查询,提升效率。
  • 优化性能:通过索引和查询计划优化,减少资源消耗。

示例

# 子查询select * from t_user where id in (select user_id from user_role);# 联合查询select * from t_user u    join user_role ur on u.id = ur.user_id;

6. 优化 OR 条件

  • 避免全表扫描:确保每个 OR 条件字段有优化索引。
  • 使用 UNION 替代 OR:提高效率。

示例

# 不优化select * from emp where id=1 or id=10;# 优化select * from emp where id=1 union select * from emp where id=10;

7. 优化分页查询

  • 覆盖索引:在排序字段上创建覆盖索引,减少分页开销。
  • 主键自增表:通过主键定位分页结果,提升效率。

示例

# 优化分页select * from tb_item where id > 2000000 limit 10;

8. 使用 SQL 提示

  • USE INDEX:指定使用特定索引。
  • IGNORE INDEX:忽略不需要的索引。
  • FORCE INDEX:强制使用指定索引。

示例

# 使用特定索引explain select * from tb_seller use index(idx_seller_name_sta_addr) where name='小米科技';

通过以上优化方法,可以显著提升数据库性能,适用于大批量数据处理、复杂查询优化等场景。

转载地址:http://lhdfk.baihongyu.com/

你可能感兴趣的文章
WAP短信:融合传统短信和互联网的新型通信方式
查看>>
mysql面试题学校三表查询_mysql三表查询分组后取每组最大值,mysql面试题。
查看>>
Mysql面试题精选
查看>>
MySQL面试题集锦
查看>>
mysql面试题,存储引擎InnoDB和MyISAM
查看>>
mysql面试题:Mysql一致性视图是啥时候建立的
查看>>
mysql面试题:为什么MySQL单表不能超过2000W条数据?
查看>>
mysql面试题:创建索引时会不会锁表?
查看>>
mysql面试题:高度为3的B+树可以存放多少数据?
查看>>
mysql颠覆实战笔记(八)--mysql的自定义异常处理怎么破
查看>>
mysql驱动、durid、mybatis之间的关系
查看>>
mysql驱动支持中文_mysql 驱动包-Go语言中文社区
查看>>
MySQL高可用之——keepalived+互为主从
查看>>
MySQL高可用切换_(5.9)mysql高可用系列——正常主从切换测试
查看>>
MySQL高可用解决方案
查看>>
MySQL高可用解决方案详解
查看>>
MYSQL高可用集群MHA架构
查看>>
MySQL高可用集群架构MHA企业级实战
查看>>
MySQL高级-MySQL存储引擎
查看>>
MySQL高级-MySQL并发参数调整
查看>>