MySQL Optimization Learning(三)

news2024/11/24 18:58:34

一、通过索引进行优化

数据结构

Data Structure Visualizations    数据可视化效果展示

Binary Search Tree

插入数据可视化效果展示

 AVL Tree

 Red/Black Tree

--MYISAM存储引擎数据和引用分开存储
DROP TABLE IF EXISTS `t_test`;
CREATE TABLE `t_test` (
  `id` int(11) NOT NULL,
 `test` varchar(9) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MYISAM;

--InnoDB
DROP TABLE IF EXISTS `t_test2`;
CREATE TABLE `t_test2` (
  `id` int(11) NOT NULL,
 `test` varchar(9) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

--查看数据存储路径
show variables like '%datadir%';
mysql> show variables like '%datadir%';
+---------------+---------------------------------------------+
| Variable_name | Value                                       |
+---------------+---------------------------------------------+
| datadir       | C:\ProgramData\MySQL\MySQL Server 8.0\Data\ |
+---------------+---------------------------------------------+
1 row in set, 1 warning (0.00 sec)

--MYISAM存储引擎有如下2个文件
t_test.MYD
t_test.MYI

--InnoDB存储引擎有如下1个文件
t_test2.ibd

1、索引基本知识

索引的优点

1、大大减少了服务器需要扫描的数据量
2、帮助服务器避免排序和临时表
3、将随机io变成顺序io

索引的用处

1、快速查找匹配WHERE子句的行
2、从consideration中消除行,如果可以在多个索引之间进行选择,mysql通常会使用找到最少行的索引
3、如果表具有多列索引,则优化器可以使用索引的任何最左前缀来查找行
4、当有表连接的时候,从其他表检索行数据
5、查找特定索引列的min或max值
6、如果排序或分组时在可用索引的最左前缀上完成的,则对表进行排序和分组
7、在某些情况下,可以优化查询以检索值而无需查询数据行

索引的分类

主键索引
唯一索引
普通索引
全文索引
组合索引

技术名词

回表
覆盖索引
最左匹配
索引下推

索引采用的数据结构

哈希表
B+树

索引匹配方式

CREATE TABLE staffs (
	id INT PRIMARY KEY auto_increment,
	NAME VARCHAR ( 24 ) NOT NULL DEFAULT '' COMMENT '姓名',
	age INT NOT NULL DEFAULT 0 COMMENT '年龄',
	pos VARCHAR ( 20 ) NOT NULL DEFAULT '' COMMENT '职位',
	add_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入职时间' 
) charset utf8 COMMENT '员工记录表';

ALTER TABLE staffs ADD INDEX idx_nap ( NAME, age, pos );

INSERT INTO staffs VALUES ('1', 'zhangsan', 30,'dev',now());
INSERT INTO staffs VALUES ('2', 'lisi', 36,'dev',now());
INSERT INTO staffs VALUES ('3', 'July', 23,'dev',now());
INSERT INTO staffs VALUES ('4', 'Mary', 30,'dev',now());
INSERT INTO staffs VALUES ('6', 'Maryz', 30,'dev',now());
INSERT INTO staffs VALUES ('7', 'July', 25,'dev',now());
INSERT INTO staffs VALUES ('8', 'July', 30,'dev',now());

mysql> show index from staffs;
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table  | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| staffs |          0 | PRIMARY  |            1 | id          | A         |           7 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| staffs |          1 | idx_nap  |            1 | NAME        | A         |           5 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| staffs |          1 | idx_nap  |            2 | age         | A         |           7 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| staffs |          1 | idx_nap  |            3 | pos         | A         |           7 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
4 rows in set (0.02 sec)

全值匹配

--全值匹配指的是和索引中的所有列进行匹配
explain select * from staffs where name = 'July' and age = '23' and pos = 'dev';
mysql> explain select * from staffs where name = 'July' and age = '23' and pos = 'dev';
+----+-------------+--------+------------+------+---------------+---------+---------+-------------------+------+----------+-------+
| id | select_type | table  | partitions | type | possible_keys | key     | key_len | ref               | rows | filtered | Extra |
+----+-------------+--------+------------+------+---------------+---------+---------+-------------------+------+----------+-------+
|  1 | SIMPLE      | staffs | NULL       | ref  | idx_nap       | idx_nap | 140     | const,const,const |    1 |   100.00 | NULL  |
+----+-------------+--------+------------+------+---------------+---------+---------+-------------------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

匹配最左前缀

--只匹配前面的几列
explain select * from staffs where name = 'July' and age = '23';
explain select * from staffs where name = 'July';
mysql> explain select * from staffs where name = 'July' and age = '23';
+----+-------------+--------+------------+------+---------------+---------+---------+-------------+------+----------+-------+
| id | select_type | table  | partitions | type | possible_keys | key     | key_len | ref         | rows | filtered | Extra |
+----+-------------+--------+------------+------+---------------+---------+---------+-------------+------+----------+-------+
|  1 | SIMPLE      | staffs | NULL       | ref  | idx_nap       | idx_nap | 78      | const,const |    1 |   100.00 | NULL  |
+----+-------------+--------+------------+------+---------------+---------+---------+-------------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

mysql> explain select * from staffs where name = 'July';
+----+-------------+--------+------------+------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table  | partitions | type | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+--------+------------+------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | staffs | NULL       | ref  | idx_nap       | idx_nap | 74      | const |    3 |   100.00 | NULL  |
+----+-------------+--------+------------+------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

匹配列前缀

--可以匹配某一列的值的开头部分
explain select * from staffs where name like 'J%';
explain select * from staffs where name like '%y';

mysql> explain select * from staffs where name like 'J%';
+----+-------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+
| id | select_type | table  | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra                 |
+----+-------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+
|  1 | SIMPLE      | staffs | NULL       | range | idx_nap       | idx_nap | 74      | NULL |    3 |   100.00 | Using index condition |
+----+-------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+
1 row in set, 1 warning (0.00 sec)

mysql> explain select * from staffs where name like '%y';
+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table  | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | staffs | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    7 |    14.29 | Using where |
+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

匹配范围值

--可以查找某一个范围的数据
explain select * from staffs where name > 'Mary';
mysql> explain select * from staffs where name > 'Mary';
+----+-------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+
| id | select_type | table  | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra                 |
+----+-------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+
|  1 | SIMPLE      | staffs | NULL       | range | idx_nap       | idx_nap | 74      | NULL |    2 |   100.00 | Using index condition |
+----+-------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+
1 row in set, 1 warning (0.00 sec)

精确匹配某一列并范围匹配另外一列

--可以查询第一列的全部和第二列的部分
explain select * from staffs where name = 'July' and age > 25;
mysql> explain select * from staffs where name = 'July' and age > 25;
+----+-------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+
| id | select_type | table  | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra                 |
+----+-------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+
|  1 | SIMPLE      | staffs | NULL       | range | idx_nap       | idx_nap | 78      | NULL |    1 |   100.00 | Using index condition |
+----+-------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------+
1 row in set, 1 warning (0.00 sec)

只访问索引的查询:也叫索引覆盖   Extra:Using index

--查询的时候只需要访问索引,不需要访问数据行,本质上就是覆盖索引
explain select name,age,pos from staffs where name = 'July' and age = 25 and pos = 'dev';
mysql> explain select name,age,pos from staffs where name = 'July' and age = 25 and pos = 'dev';
+----+-------------+--------+------------+------+---------------+---------+---------+-------------------+------+----------+-------------+
| id | select_type | table  | partitions | type | possible_keys | key     | key_len | ref               | rows | filtered | Extra       |
+----+-------------+--------+------------+------+---------------+---------+---------+-------------------+------+----------+-------------+
|  1 | SIMPLE      | staffs | NULL       | ref  | idx_nap       | idx_nap | 140     | const,const,const |    1 |   100.00 | Using index |
+----+-------------+--------+------------+------+---------------+---------+---------+-------------------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

MySQL官网提供数据结构案例

下载sakila database,执行SQL语句

--导入DB结构
mysql> source D:\.m2\sakila-db\sakila-schema.sql
Query OK, 0 rows affected (0.01 sec)
.....

--导入数据
mysql> source D:\.m2\sakila-db\sakila-data.sql
Query OK, 0 rows affected (0.00 sec)

Database changed
Query OK, 0 rows affected (0.00 sec)
...

2、哈希索引

基于哈希表的实现,只有精确匹配索引所有列的查询才有效
在mysql中,只有memory的存储引擎显式支持哈希索引
哈希索引自身只需存储对应的hash值,所以索引的结构十分紧凑,这让哈希索引查找的速度非常快
哈希索引的限制
    1、哈希索引只包含哈希值和行指针,而不存储字段值,索引不能使用索引中的值来避免读取行
    2、哈希索引数据并不是按照索引值顺序存储的,所以无法进行排序
    3、哈希索引不支持部分列匹配查找,哈希索引是使用索引列的全部内容来计算哈希值
    4、哈希索引支持等值比较查询,也不支持任何范围查询
    5、访问哈希索引的数据非常快,除非有很多哈希冲突,当出现哈希冲突的时候,存储引擎必须遍历链表中的所有行指针,逐行进行比较,直到找到所有符合条件的行
    6、哈希冲突比较多的话,维护的代价也会很高

案例

当需要存储大量的URL,并且根据URL进行搜索查找,如果使用B+树,存储的内容就会很大
select id from url where url=""
也可以利用将url使用CRC32做哈希,可以使用以下查询方式:
select id fom url where url="" and url_crc=CRC32("")
此查询性能较高原因是使用体积很小的索引来完成查找

CRC(Cyclic Redundancy Check)校验实用程序库在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段。在诸多检错手段中,CRC是最著名的一种。CRC的全称是循环冗余校验。

CRC的本质
是模-2除法的余数,采用的除数不同,CRC的类型也就不一样。通常,CRC的除数用生成多项式来表示。最常用的CRC码的生成多项式如表1所示。最常用的CRC码及生成多项式名称生成多项式
CRC-12

CRC-16

CRC-CCITT

CRC-32

由于CRC在通讯和数据处理软件中经常采用,笔者在实际工作中对其算法进行了研究和比较,总结并编写了一个具有最高效率的CRC通用程序库。该程序采用查表法计算CRC,在速度上优于一般的直接模仿硬件的算法,可以应用于通讯和数据压缩程序。

MySQL Optimization Learning(一)

MySQL Optimization Learning(二)

不断学习才能不断提高!
生如蝼蚁,当立鸿鹄之志,命比纸薄,应有不屈之心。
乾坤未定,你我皆是黑马,若乾坤已定,谁敢说我不能逆转乾坤?
努力吧,机会永远是留给那些有准备的人,否则,机会来了,没有实力,只能眼睁睁地看着机会溜走。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/715267.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

websocket 发送的消息超过默认限制就会自动断开连接

springboot集成websocket需要三步&#xff1a; 添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>2.1.6.RELEASE</version></dependency>…

【GIT】Git常用命令学习

Git常用命令学习 说明&#xff1a;<>表示占位符的说明&#xff0c;[]表示可选&#xff0c;/表示“或” 仓库操作 初始化创建一个本地仓库 git init克隆远程仓库至本地 git clone <远程仓库地址> [仓库名称] #可以加上自定义仓库名称配置仓库 git config user.name…

Linux的动静态库

动静态库 1. 见一见动静态库2. 动静态库概念2.1 为什么要有动静态库2.2 定义 3. 写一写——库的设计角度打包成静态库打包成动态库 4. 用一用——使用者角度4.1 直接使用头文件和源文件&#xff08;直接给源代码&#xff09;4.2 得到头文件和源文件进过处理后形成的二进制文件.…

C++ - 20230703

一. 思维导图 二.练习 全局变量&#xff0c;int monster 10000;定义英雄类hero&#xff0c;受保护的属性string name&#xff0c;int hp,int attck&#xff1b;公有的无参构造&#xff0c;有参构造&#xff0c;虚成员函数 void Atk(){blood-0;}&#xff0c;法师类继承自英雄类…

SpringCloud:微服务技术

一、认识微服务&#xff1a; 首先&#xff0c;微服务架构不等于SpringCloud&#xff0c;微服务架构是一种经过良好架构设计的分布式架构方案&#xff0c; &#xff0c;它将应用构建成一系列按业务领域划分模块的&#xff0c;小的自治服务&#xff0c;并解决服务拆分所产生的各种…

css基础知识十五:如果要做优化,CSS提高性能的方法有哪些?

一、前言 每一个网页都离不开css&#xff0c;但是很多人又认为&#xff0c;css主要是用来完成页面布局的&#xff0c;像一些细节或者优化&#xff0c;就不需要怎么考虑&#xff0c;实际上这种想法是不正确的 作为页面渲染和内容展现的重要环节&#xff0c;css影响着用户对整个…

DL环境安装之GCC9,Python9与IDE连接远程环境:python notebook,解释器,C toolchain

文章目录 一.安装gcc91. 设置x86 centos7 yum源2. 编译安装 二、安装python3.91.前置依赖2. 编译安装3.建立软连接或环境变量 三、IDE连接远程环境1.IDE 远程notebook2.IDE 远程Python解释器3.远程toolchain &#xff08;后续可能有用&#xff09; 一.安装gcc9 系统自带的cc可…

2023亚马逊云科技中国峰会——Amazon DeepRacer

1.DeepRacer技术背景 早在20世纪初汽车问世之时&#xff0c;发明家们便已提出无人驾驶的设想。但即便是实现无人驾驶的初级阶段&#xff0c;也经历了足足百年时间。毕竟在复杂的城市路况下&#xff0c;机器若想像人一样实现感知、决策、控制等功能&#xff0c;必定面临各种复杂…

Simulink仿真模块 - Product

Product:标量和非标量的乘除运算或者矩阵的乘法和逆运算 库:Simulink / Commonly Used Blocks Simulink / Math Operations HDL Coder / Commonly Used Blocks HDL Coder / HDL Floating Point Operations HDL Coder / Math Operations 模型为: 双击模型打开参数设置界面为…

静电测试仪如何在生产中帮助我们

静电测试仪在生产中可以帮助我们进行静电防护和质量控制。以下是它在生产中的具体帮助&#xff1a; 1. 静电防护&#xff1a;静电测试仪可以用来测量物体表面的静电电荷&#xff0c;通过监测静电电荷的大小和分布情况&#xff0c;预防静电产生和积累&#xff0c;降低产品受到静…

如何快速构建一个交互式的JavaScript UI仪表板?用DHTMLX很简单!

DHTMLX Suite包含了超过20个UI小部件&#xff0c;可以帮助开发功能齐全的Web应用程序。例如&#xff0c;开发者可以创建一个全面的仪表板来可视化和监控票务系统的性能。 在本文这个JavaScript仪表板教程中&#xff0c;我们将介绍如何在DHTMLX Suite UI小部件和Optimus微框架的…

Android性能优化-数据结构

本文链接&#xff1a;Android性能优化-数据结构_猎羽的博客-CSDN博客 云笔记链接&#xff1a;https://note.youdao.com/s/84OhDByE

SysML建模示例水蒸馏器图形大全(从图16.1到图16.30)EA从零开始复刻

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集

图像聚类算法

什么是分类 分类 分类其实是从特定的数据中挖掘模式&#xff0c;作出判断的过程。 分类学习主要过程&#xff1a; &#xff08;1&#xff09;训练数据集存在一个类标记号&#xff0c;判断它是正向数据集&#xff08;起积极作用&#xff0c;不是垃圾短信&#xff09;&#xf…

C++与JAVA中迭代器的不同

1.C迭代器 #include <iostream> #include <vector> using namespace std;int main() {vector<int> vec;for(int i 0; i < 10; i) vec.push_back(i);for(std::vector<int>::iterator it vec.begin(); it ! vec.end(); it) {cout << "…

以太网常见设备(五)

目录 一、网卡 二、中继器 三、集线器 四、网桥 五、2层交换机 六、路由器 七、网关 一、网卡 网卡&#xff0c;全称网络接口卡&#xff0c;有时也叫做网络适配器、网卡、LAN卡。是计算机连接网络的接口。 二、中继器 中继器是OSI模型第1层物理层面上延长网络的设备。其…

pdf怎样转换成ppt格式?分享简单快捷的方法!

PDF和PPT是两种常见的文件格式&#xff0c;它们在使用场景上有所不同。PDF适合单独阅读和查看&#xff0c;而PPT则更适合在多人演讲时进行演示。有时候我们需要将PDF文件转换为PPT格式&#xff0c;以便进行演示、分享或修改。这在教育培训行业尤其常见&#xff0c;教师经常需要…

01-基础入门-概念名词

基础入门-概念名词 基础入门-概念名词1、域名&#xff08;1&#xff09;什么是域名&#xff08;2&#xff09;在哪里注册域名&#xff08;3&#xff09;二级域名和多级域名&#xff08;4&#xff09;域名对安全测试的意义 2、DNS&#xff08;1&#xff09;什么是DNS&#xff08…

常用开发功能——批量文件导出

某天工作接到一个需求&#xff1a;批量导出场站的订单信息&#xff0c;一个场站一个Excel文档&#xff1b; 与单个文件导出的区别在于&#xff0c;单个导出一次性只导出一个文件&#xff0c;在输出流中写入这一个文件即可&#xff0c;那么如何一次性导出多个文件&#xff1f;难…

茶叶小程序怎么做

茶叶小程序商城是一个专为茶叶爱好者打造的购物平台&#xff0c;提供了一系列便利的功能&#xff0c;使用户能够轻松选购适合自己口味的优质茶叶。以下是该小程序商城的主要功能介绍&#xff1a; 1. 商品展示&#xff1a;在茶叶小程序商城中&#xff0c;用户可以浏览各种各样的…