执迷 执迷
首页
  • 技术分享

    • 小白都能看懂的闭包
    • GO-GMP模型
    • MySQL调优
    • centos7部署nacos
    • elasticserch
    • redis
  • 发布一个node插件

    • 发布一个npm包
    • 如何打包一个插件工具库
    • 打包工具的选择
  • JavaScript
  • ES6
  • CSS
  • 框架
  • Node
  • 服务
  • 其他
自我介绍
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

执迷

代码也是艺术
首页
  • 技术分享

    • 小白都能看懂的闭包
    • GO-GMP模型
    • MySQL调优
    • centos7部署nacos
    • elasticserch
    • redis
  • 发布一个node插件

    • 发布一个npm包
    • 如何打包一个插件工具库
    • 打包工具的选择
  • JavaScript
  • ES6
  • CSS
  • 框架
  • Node
  • 服务
  • 其他
自我介绍
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 前端

  • 后端及运维

    • 服务
    • GMP模型
    • MySQL调优
      • 索引优化
        • Innodb引擎层优化
      • 硬件调优
        • 磁盘调优
        • 启用磁盘阵列
        • 分散磁盘IO
        • 裸磁盘设备
    • centos7部署nacos
    • consul单台机器部署,注册外网服务健康检查
    • centos7安装ES
    • MySQL底层
    • centos7安装rabbitmq
    • docker部署redis
    • 平常常用命令
    • MySQL调优
  • 年终总结

  • 个人博客
  • 后端及运维
刘某
2024-07-30
目录

MySQL调优原创

@TOC

# 调优之前的考虑

在准备MySQL数据库优化前,一定要注意,系统瓶颈来自于哪部分,因为sql的优化带来的收益,可能远远比不上在架构部分的优化,架构层面的优化带来的效果会比在数据库的优化来的高,在足够了解系统后,决定在数据库层面优化后,可参考优化的部分。

# 架构层面的建议

可参考

  • 分库分表
  • 分布式集群
  • 读写分离
  • 业务拆分
  • 分级缓存

# MySQL优化

MySQL版本>=5.7,Innodb存储引擎之上 在单台MySQL服务中,读写能力IOPS的上限基本固定,不同配置的机器上表现不同,sql调优是在该基础上,趋近于机器性能的上限。

  • SQL语句的优化
  • 索引优化
  • 硬件和OS调优

# 索引优化

三星索引系统原则:索引设计初步往第三星靠拢 一星:索引将相关的记录放在一起。即在一系列必要的列上建立索引,不必为where条件里的所有得列建立索引。 二星:索引中数据的顺序和排序要求的数据的顺序一致。通常将选择性更高的列放在索引列的最前面。 三星:索引中的列包含查询所需要的所有列。因为索引中已经包含查询所需的全部字段 我们列举一张数据表展示,建表语句以及插入数据

# 建表语句
CREATE TABLE `employees` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(24) NOT NULL DEFAULT '' COMMENT '姓名',
 `age` int(11) NOT NULL DEFAULT '0' COMMENT '年龄',
 `position` varchar(20) NOT NULL DEFAULT '' COMMENT '职位',
 `hire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入职时间',
 PRIMARY KEY (`id`) -- 主键索引,
 KEY `idx_age` (`age`) USING BTREE -- 针对age字段的索引
 KEY `idx_position` (`position`) USING BTREE -- 针对position字段的索引
 KEY `idx_name_age_position` (`name`,`age`,`position`) USING BTREE -- 联合索引
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='员工记录表';

## 插入一些示例数据
DROP PROCEDURE IF EXISTS insert_emp;
DELIMITER ;;
CREATE PROCEDURE insert_emp()
BEGIN
  DECLARE i INT;
  DECLARE rand_age INT;
  DECLARE rand_position VARCHAR(7);
  SET i = 1;
  WHILE (i <= 100000) DO
    SET rand_age = FLOOR(RAND() * (60 - 10 + 1)) + 10; -- 生成随机年龄,范围在10到60之间
    SET rand_position = CASE FLOOR(RAND() * 2)
                          WHEN 0 THEN 'dev'
                          ELSE 'manager'
                        END; -- 随机选择职位为 'dev' 或 'manager'
    INSERT INTO employees (name, age, position) VALUES (CONCAT('test', i), rand_age, rand_position);
    SET i = i + 1;
  END WHILE;
END;;
DELIMITER ;
CALL insert_emp();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
  • 让我们来仔细看看索引包含的信息
SHOW INDEX FROM employees;
1

在这里插入图片描述 Cardinality列为该索引的基数,反映了索引列的离散性 索引优化部分,分2种情况

  • 一种是在索引失效的情况下

有时候自己设置了索引,但是再实际查询的时候还是非常慢,那么可以使用EXPLAIN语句查询

EXPLAIN SELECT * FROM employees WHERE name > 'test2' AND age > 22 AND position ='dev';
1

在这里插入图片描述

  • 一种是在索引生效的情况下,尽量优化走的索引树

# Innodb引擎层优化

  • buffer poll
  • 隔离级别

# 硬件调优

# 磁盘调优

磁盘调度算法 (noop,deadline,cfq,mq-deadline,kyber) os文件系统

# 启用磁盘阵列

# 分散磁盘IO

# 裸磁盘设备

ps:每日更新

#数据库#MySQL
上次更新: 2024/07/30, 22:53:10
GMP模型
centos7部署nacos

← GMP模型 centos7部署nacos→

最近更新
01
MySQL调优 原创
08-04
02
MySQL底层 原创
07-30
03
consul单台机器部署,注册外网服务健康检查 原创
07-30
更多文章>
Theme by Vdoing | Copyright © 2019-2024 执迷 | 闽ICP备2022018045号 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式