Explain详解与索引最佳实践

2023-11-16

Explain 解释

示范表

DROP TABLE IF EXISTS `actor`;
CREATE TABLE `actor` (
`id` int(11) NOT NULL,
`name` varchar(45) DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 INSERT INTO `actor` (`id`, `name`, `update_time`) VALUES (1,'a','2017‐12‐22
15:27:18'), (2,'b','2017‐12‐22 15:27:18'), (3,'c','2017‐12‐22 15:27:18');

 DROP TABLE IF EXISTS `film`;
 CREATE TABLE `film` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(10) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `idx_name` (`name`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 INSERT INTO `film` (`id`, `name`) VALUES (3,'film0'),(1,'film1'),(2,'film2');

 DROP TABLE IF EXISTS `film_actor`;
 CREATE TABLE `film_actor` (
 `id` int(11) NOT NULL,
 `film_id` int(11) NOT NULL,
 `actor_id` int(11) NOT NULL,
 `remark` varchar(255) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `idx_film_actor_id` (`film_id`,`actor_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 INSERT INTO `film_actor` (`id`, `film_id`, `actor_id`) VALUES (1,1,1),(2,1,2),(3,2,1);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用语句

explain select * from actor where id =1;
show warnings;


在这里插入图片描述
show warnings 同时执行代表mysql会优化你的sql语句,显示的语句为实际运行的sql,看一个大概,不一定真正是可以执行的sql。

explain 每一列说明

作用
id id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行
select_type 表示对应行是简单还是复杂的查询
table 这一列表示 explain 的一行正在访问哪个表
partitions 分区信息 现在很少用
type 这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围
possible_keys 这一列显示查询可能使用哪些索引来查找
key 这一列显示mysql实际采用哪个索引来优化对该表的访问
key_len 这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列
ref 这一列显示了在key列记录的索引中,表查找值所用到的列或常量
rows 这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的行数
filtered rows * filtered/100 可以估算出将要和 explain 中前一个表进行连接的行数
Extra 这一列展示的是额外信息

id

在这里插入图片描述
越大的代表越早执行,如果相等的话从上到下执行,id为NULL最后执行

select_type

  • simple 最简单的查询 不包含子查询和union
  • primary 复杂查询中最外层的 select
  • subquery 包含在 select 中的子查询(不在 from 子句中)
  • derived 包含在 from 子句中的子查询。MySQL会将结果存放在一个临时表中,也称为派生表

在这里插入图片描述
film在from后面的子查询,临时表。derived 英文就是这个意思
subquery 在from前面的子查询,subquery 子查询的查询
primary 代表是这些查询最外层的查询

table

当 from 子句中有子查询时,table列是 格式,表示当前查询依赖 id=N 的查询,于是先执行 id=N 的查询。
当有 union 时,UNION RESULT 的 table 列的值为<union1,2>,1和2表示参与 union 的 select 行id。
在上面select_type 的例子中< derived3>就是代表数据是来自id为3的衍生表

type

依次从最优到最差分别为:null>system > const > eq_ref > ref > range > index > ALL一般来说,得保证查询达到range级别,最好达到ref

NULL:mysql能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引。例如:在索引列中选取最小值,可以单独查找索引来完成,不需要在执行时访问表

 explain select min(id) from film;

在这里插入图片描述
system,const:mysql能对查询的某部分进行优化并将其转化成一个常量(可以看show warnings 的结果)。用于primary key 或 unique key 的所有列与常数比较时,所以表最多有一个匹配行,读取1次,速度比较快。system是const的特例,表里只有一条元组匹配时为system

explain  select * from (select * from film where id = 1) tmp;
show warnings;

在这里插入图片描述
在这里插入图片描述
可以看出const的可以根据聚簇索引查到唯一的数据,而system甚至都不用再查表,因为子查询就一行记录。sql可以优化成dual,等于常量。

eq_ref:primary key 或 unique key 索引的所有部分被连接使用 ,最多只会返回一条符合条件的记录。这可能是在const 之外最好的联接类型了

explain select * from film_actor left join film on film_actor.film_id = film.id

在这里插入图片描述
主表中的关联字段的值,在子表能找到唯一一条的对应记录,而不是多个。

ref:相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行。

explain select * from film where name = 'film1';

在这里插入图片描述
说明虽然走了索引 但是是普通的索引可以查到多个

explain select film_id from film left join film_actor on film.id = film_actor.film_id;

在这里插入图片描述
说明film_actor表的film_id虽然走了索引,但是这个索引是普通索引,存在多个相同。

range:范围扫描通常出现在 in(), between ,> ,<, >= 等操作中。使用一个索引来检索给定范围的行。

explain select * from actor where id > 1;
show warnings;

在这里插入图片描述
类似就是在B+树的叶子节点底端根据指针找到数据
在这里插入图片描述
如果数据太大还是比较慢,但至少还走了索引

index:扫描全索引就能拿到结果,一般是扫描某个二级索引,这种扫描不会从索引树根节点开始快速查找,而是直接对二级索引的叶子节点遍历和扫描,速度还是比较慢的,这种查询一般为使用覆盖索引,二级索引一般比较小,所以这种通常比ALL快一些。

explain select * from film;

在这里插入图片描述
file表就只有两个字段id,和name。两个字段都有索引。为什么走二级索引不走聚簇索引。因为文件中维护着两个索引树,聚簇索引的叶子阶段存着表的所有数据,二级索引的叶子节点存放着聚簇索引的id,以供回表查询。所以二级索引的占用比聚簇索引小。file表就两个字段,二级索引的叶子存放的就是id,没有其他字段了。所以不用再回表了,只有id,直接获取即可。如果这张表再多一个其他字段,就需要回表,只能走聚簇索引了。

ALL

explain select * from actor;

在这里插入图片描述
这个就是index例子中多了一个字段的情况,只能走聚簇索引全表扫描。

key_len

假如是一个联合索引,key_len代表用到的索引的字节数

//用到联合索引的其中的一个索引 结果为4
explain select * from film_actor where film_id = 2;

在这里插入图片描述

//用到联合索引的其中的两个索引 结果为8
explain select * from film_actor where film_id = 2 and actor_id =1;

在这里插入图片描述
key_len计算规则如下:

  1. 字符串,char(n)和varchar(n),5.0.3以后版本中,n均代表字符数,而不是字节数,如果是utf-8,一个数字或字母占1个字节,一个汉字占3个字节
    char(n):如果存汉字长度就是 3n 字节
    varchar(n):如果存汉字则长度是 3n + 2 字节,加的2字节用来存储字符串长度,因为varchar是变长字符串数值类型
  • tinyint:1字节
  • smallint:2字节
  • int:4字节
  • bigint:8字节
  1. 时间类型
  • date:3字节
  • timestamp:4字节
  • datetime:8字节

如果字段允许为 NULL,需要1字节记录是否为 NULL
索引最大长度是768字节,当字符串过长时,mysql会做一个类似左前缀索引的处理,将前半部分的字符提取出来做索引。

ref

在这里插入图片描述
显示关联的字段,写死的就是常量,关联的就是写字段名

rows

通过mysql算法大概算出要计算扫描多少行

EXTRA

Using index:是用到了覆盖索引(叶子节点就已经存在了全部数据,不用回表查询了),算比较好的结果

-- 这个语句结果using index 因为select后的字段就是索引字段,不用回表
explain select film_id from film_actor where film_id = 1;
-- 这个语句结果不是using index 因为select后还有remark字段,需要回表
explain select film_id,remark from film_actor where film_id = 1;

Using where:如果MySQL无法使用索引或者其他优化方式来加速查询,并且需要对表中的所有行进行扫描以过滤出符合条件的行,那么MySQL就会显示"Using where"标志。

-- actor的name没有建立索引
explain  select * from actor where name = 'a';
-- 虽然film_id 有索引 但是还是要全表扫描
 explain select film_id from film_actor where film_id > 1;
-- 这样不用全表扫描 所以没有Using where
explain select film_id from film_actor where film_id = 1;

Using index condition:查询的列不完全被索引覆盖,where条件中是一个前导列的范围;

-- 使用了索引,但是*中有索引查不到的数据,需要回表,如果select后的字段改成索引中有的字段,就会优化成using where(Using where例子中的第二个)
explain select * from film_actor where film_id > 1;

Using temporary:表示出现了临时表,一般出现在distinct group by没有索引的字段

-- actor的表name没有索引,去重的话要把所有数据都加载到内存形成临时表,然后再扫描临时表去重
explain select distinct name from actor
-- film的表file有索引,结果为Using index,因为在第一次扫描索引树的时候,就可以直接去重,而不用先加载再排序
explain select distinct name from film

Using filesort :表示出现文件排序,一般出现在order by上没有索引的字段

 explain select * from actor order by name;

因为所有树是有序的,如果建立索引就可以直接查到

Select tables optimized away:使用某些聚合函数(比如 max、min)来访问存在索引的某个字段,贼快

 explain select min(id) from film

索引最佳实践

建立一张表,id为主键,联合索引idx_name_age_position (name,age,position)

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_name_age_position` (`name`,`age`,`position`) USING BTREE
 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='员工记录表';

 INSERT INTO employees(name,age,position,hire_time) VALUES('LiLei',22,'manager',NOW());
 INSERT INTO employees(name,age,position,hire_time) VALUES('HanMeimei',
,'dev',NOW());
 INSERT INTO employees(name,age,position,hire_time) VALUES('Lucy',23,'dev',NOW());

1.全值匹配
能用到所有的索引尽量使用,在B+树的搜索中,用的越多查询的越精确,越快。

EXPLAIN SELECT * FROM employees WHERE name= 'LiLei';
EXPLAIN SELECT * FROM employees WHERE name= 'LiLei' AND age = 22;
EXPLAIN SELECT * FROM employees WHERE name= 'LiLei' AND age = 22 AND position 'manager'

2.最左前缀法则

因为B+树中要根据索引建立的顺序来找。name相等的前提下age有序,在age相等的前提下position 有序 来建立的所有。从第二个直接开始,age不一定有序。无法使用。


EXPLAIN SELECT * FROM employees WHERE name = 'Bill' and age = 31;

-- 不走
EXPLAIN SELECT * FROM employees WHERE age = 30 AND position = 'dev';
EXPLAIN SELECT * FROM employees WHERE position = 'manager';

3.不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
匹配不上

EXPLAIN SELECT * FROM employees WHERE left(name,3) = 'LiLei';

4.存储引擎不能使用索引中范围条件右边的列

-- 这个走了三个列的索引
 EXPLAIN SELECT * FROM employees WHERE name= 'LiLei' AND age = 22 AND position ='manager';

-- 只走了前两个索引 第三个没走
 EXPLAIN SELECT * FROM employees WHERE name= 'LiLei' AND age > 22 AND position ='manager';

原因还是因为b+树的索引存放是有序的。在name相等的前提下age有序,在age相等的前提下position 有序。第一个符合这个原因,第二个name相等,所以age有序,可以使用大于走索引。但是结果虽然有序但是不相等,所以position 无序,没有办法直接走索引。

5.尽量使用覆盖索引(只访问索引的查询(索引列包含查询列)),减少 select * 语句

存在回表的情况

6.mysql在使用不等于(!=或者<>),not in ,not exists 的时候无法使用索引会导致全表扫描
< 小于、 > 大于、 <=、>= 这些,mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引

7.is null,is not null 一般情况下也无法使用索引

8.少用or或in,用它查询时,mysql不一定使用索引,mysql内部优化器会根据检索比例、表大小等多个因素整体评
估是否使用索引,详见范围查询优化

可以分割成两个小的范围来走索引

9.字符串不加单引号索引失效

10.like以通配符开头(‘$abc…’)mysql索引失效会变成全表扫描操作

原因:如果通配符在前面,加入根据name查找,可能是 aname,bname,cname。
索引树中是以name来存储。无法进行匹配,只能走全表扫描。但是如果是
或者na%e,那么可能会优化为name = na,索引排序就是根据字母的编码排序。虽然没那么快,但是至少也能走索引。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Explain详解与索引最佳实践 的相关文章

  • 如何将此本机 SQL 查询转换为 HQL

    所以我有这个很长的复杂的 Native SQLQuery string hql SELECT FROM SELECT a rownum r FROM select f2 filmid f2 realisateurid f2 titre f2
  • 如何限制两个表之间一对多关系中的多个数量?

    我有一个带有两个 MySql 表的 MySQL 数据库 第一个是第一个表 表 A 有一列具有唯一值 从值 从 1 到 n 在第二个表 2 表 B 中 我有两列 在第一个表中我有一个名称 在第二个我的值从 1 到 n 如果我在 中添加一个值
  • Unicode(希腊语)字符存储在数据库中,例如“??????”

    数据库中的希腊字符就像问号 我找不到解决办法 我使用 Java Swing 开发了一个应用程序 但是当我在 MySQL 中插入希腊字母时 就像问号一样 我将数据库排序规则更改为 utf8 并将列也更改为 utf8 我的项目编码设置为UTF
  • Postgresql:SERIAL 在约束 INSERT 失败时递增

    有一个像这样的简单表结构 CREATE TABLE test id INT PRIMARY KEY sid SERIAL 我注意到如果我尝试插入一行但它未通过约束测试 即主键约束 SERIAL计数器无论如何都会增加 所以下一次成功插入 si
  • 用户“root”@“localhost”的 Spring Boot MySql 访问被拒绝

    我有 Spring Boot 应用程序并部署到远程服务器 该应用程序在我的计算机上运行 MySQL连接URL 用户名和密码本地和远程MySQL相同 数据库和应用程序在同一台机器上 我检查了我的连接信息并执行了以下命令 GRANT ALL P
  • 使用元表中的多个条目的 Compex MySQL 左连接

    我正在尝试创建一个查询来从主表 WordPress 用户表 和用户元表中获取信息 如果您不熟悉 WP DB 架构 wp users 保存基本用户信息及其 ID wp usermeta 保存 ID meta key 和 meta value
  • SQL 查询按字母顺序对除一个之外的所有结果进行排序?

    我有一个小问题 我正在使用 SQL 数据库的结果填充选择标记 我想要的是最后一个添加为顶部条目 其余条目按字母顺序排序 所以它会返回 developerID developerName 40 ZZZ Dev 39 A Dev 38 Be N
  • SQL Server中主键和唯一索引的区别[重复]

    这个问题在这里已经有答案了 我的公司目前正在重写我们最近获得的一个应用程序 我们选择使用 ASP net mvc4 来构建这个系统 并使用实体框架作为我们的 ORM 我们收购的公司的前任所有者非常坚定地要求我们使用他们的旧数据库 并且不对其
  • Rails 3 按字段排序和最后

    您好 我对 Rails 3 2 和订购有疑问 当想要按字段对集合进行排序时 调用时 last ActiveRecord行为怪异 gt gt User order FIELD id 1 User Load 0 4ms SELECT users
  • 如何将 SQL 结果存入 STRING 变量?

    我正在尝试获取 C 字符串变量或字符串数 组中的 SQL 结果 是否可以 我需要以某种方式使用 SqlDataReader 吗 我对 C 函数和所有功能非常陌生 曾经在 PHP 中工作 所以如果可以的话请给出一个工作示例 如果相关 我已经可
  • MySQL如何根据字段是否存在来插入新记录或更新字段?

    我正在尝试实现一个评级系统 在数据库表中保留以下两个字段 评级 当前评级 num rates 迄今为止提交的评分数量 UPDATE mytable SET rating rating num rates theRating num rate
  • 使用 PHP 和 MySQL 的服务器端事件

    我正在使用 PHP 和 MySQL 构建一个 非常基本的 应用程序 该应用程序的目的是在网页上显示 实时 数据交易 这些交易来自于transactionsMySQL 数据库中的表 到目前为止 我可以在网页上检索并显示数据 不过我期待看到数据
  • SQL 更新数据集中的位置

    id1 id2 bool 1 1 F 1 2 F 2 1 F UPDATE table name SET bool T WHERE id1 id2 IN 1 1 2 1 Need work here 所以基本上我想选择条件为 id1 id2
  • SQL Server 2012(代号:Denali)CTP 3的FIRST_VALUE和LAST_VALUE的实际用途是什么

    随着 Denali 的 CTP 3 版本的发布 我们有了更多的分析功能 其中我对其中两个感兴趣 a 第一个值 http msdn microsoft com en us library hh213018 28v SQL 110 29 asp
  • SQL 用新值替换旧值

    我有一个名为tbl Products 其中有一列名为articlenumber并且充满了像这样的数字s401 s402 etc 我生成了一个包含新商品编号的列表 它将替换旧的商品编号 s401 I00010 s402 I00020 s403
  • 我不确定在 SQL 中声明这些变量时出了什么问题

    我有以下代码 USE pricingdb go CREATE TABLE dbo Events 060107 2012 Date Time varchar 20 COLLATE SQL Latin1 General CP1 CI AS NU
  • 语言翻译语法

    我正在尝试为我的项目添加另一种语言 我们知道语言可以表现出主语和谓语的差异 例如 英语 Mustafa和他的朋友去看电影ahmet today 土耳其 Mustafa布昆 阿卡达西ahmetile birlikte sinemaya git
  • 导入 CSV 以更新表中的行

    大约有 26K 个产品 帖子 每个产品都有如下元值 post id 列是数据库中的产品 ID sku meta key 是每个产品的唯一 ID 我收到了一个新的 CSV 文件 该文件更新了每个产品的 sale price meta key
  • Sql 查询:Sum,表中所有可能的行组合

    SQL Server 2008 R2 表结构示例 create table TempTable ID int identity value int insert into TempTable values 6 insert into Tem
  • 不唯一的表/别名

    因此 我尝试使用多个联接来运行此查询 以获得我想要的精确行 但我不断收到此错误 不唯一的表 别名 ss prices 我正在运行的查询 select ss accounts id ss accounts bot acc id ss acco

随机推荐

  • 【Educoder作业】C++ 面向对象 - 类的多态性与虚函数

    Educoder作业 C 面向对象 类的多态性与虚函数 这个就是知道 v i r t u a l virtual
  • C++复习笔记--没有与这些操作数匹配的“<<“运算符C/C++(349)

    1 报错代码 include
  • 各类排序算法的比较总结

    排序算法是最基本最常用的算法 不同的排序算法在不同的场景或应用中会有不同的表现 我们需要对各种排序算法熟练才能将它们应用到实际当中 才能更好地发挥它们的优势 今天 来总结下各种排序算法 下面这个表格总结了各种排序算法的复杂度与稳定性 各种排
  • osgEarth的Rex引擎原理分析(一二三)osgEarth的缓存及其结构

    目标 十七 中问题43 1 缓存分两类 1 文件缓存 osgDB FileCache FileSystemCache 位于osgEarthDrivers cache filesystem FileSystemCache osgDB File
  • 51单片机——中断

    中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置 中断功能的存在 很大程度上提高了单片机处理外部或内部事件的能力 老版51单片机内部共有5个中断源 中断是处理器一种工作状态的描述 我们把引起中断的原因 或者能够发出中断请求信号的
  • 11-----curl命令行代替post请求带baby

    1 curl命令行代替post请求带baby 使用curl命令行代替postman在linux是非常方便的 curl H Content Type application json X POST data camera uid 123 45
  • 半虚拟化和全虚拟化的区别

    全虚拟化 Full virtualization 也称为原始虚拟化技术 是另一种虚拟化方法 该模型使用虚拟机协调客户 操作系统和原始硬件 见图2 这里 协调 是一个关键词 因为VMM在客户操作系统和裸硬件之间用于工作协调 一些受保护的指令必
  • 【nginx】静态文件处理:root和alias的区别以及try_files用法

    对于静态文件 nginx支持配置文件路径 关键字为root和alias 简介 配置系统 data www目录下有如下文件 data www file a txt b txt backup c txt d txt nginx 配置中 loca
  • 面向对象设计基本原则(举例说明)

    单一职责原则 SRP 就一个类而言 应该仅有一个引起它变化的原因 如果一个类承担的职责过多 就等于把这些职责耦合在一起 一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力 这种耦合会导致脆弱的设计 当变化发生时 设计会遭受到意想不到的
  • 基于Qt的轻量级的Ribbon控件(Office样式UI)

    基于Qt的轻量级的Ribbon控件 Office样式UI 界面截图 它支持4种目前常见的ribbon样式在线切换 包括2种office模式 office模式是最常见的ribbon模式了 就是我们经常看到的word模式 office模式的ta
  • Rust vs Go:两者结合效果更好!

    最近看到一个程序员工资排行的图 435501份数据 调查显示 Rust 是最赚钱的 随着 Rust 的发展和它表现出的很多优点 越来越多 Gopher 开始关注 Rust 首先 Rust 没有历史包袱 集表达力 高性能 内存安全于一身 可以
  • 2022年11月7日--11月13日(ue4 tf1视频教程+cesium for ue源码CesiumUtility抄写,本周10小时,合计1737小时,剩余8263小时)

    目前 mysql 7 1 tf1 3 3 oss 12 1 蓝图反射 1 7 moba 1 5 webapp 2 4 mmoarpg 00A 04 socket 2 8 根据月计划 ue4 tf1视频教程 进度按照每天一小时时长视频 其余时
  • 博客点击率过万

    写博客有5个月了 今天一看点击率过万了 但是转载的一篇文章点击了2500多次 怎么大家喜欢看文字的东西 而不喜欢技术呢 还是我写的太烂了 2012 7 9
  • QT6+Halcon

    2020年12月8日 Qt公司正式发布了Qt 6 0 这一软件开发平台全新的主要版本 Qt 6 0 已被重新设计为面向未来 以生产力为重点的基础平台 QT迎来一个新时代 Qt Halcon这种组合在机器视觉方面应用非常广泛 一 Qt6全新理
  • C++面向对象+案例(附代码)

    C 核心编程 接上一篇 c 基础入门 文章目录 C 核心编程 1 内存分区模型 1 1 程序运行前 1 2程序运行后 1 3new操作符 2 引用 略 3 函数提高 4 类和对象 4 1封装 4 1 2struct与class区别 4 1
  • 现货交易技巧有哪些可以帮助大家

    想要在现代生活中实现资产升值 或许各种投资理财是最好的选择 但是 不管是选择哪一种 大家都需要掌握基本的一些投资技巧的 比如说现货交易 作为新兴的投资行业 大家必须要认真了解现货交易技巧 这样才可以更好地开展现货交易活动 只有现货交易基础打
  • three.js入门到实战

    学习之前 示例演示 参考资料 api查询 http www webgl3d cn threejs docs index html 代码地址 https github com mrdoob three js 学习方法讲解 对于没有基础的前端小
  • 电机与接触器小结

    目录 各类电机区别 交流 直流电机的区别 同步 异步两类电机区别 为什么会同步 为什么会不同步呢 永磁同步电机 永磁同步电机内部构造 永磁同步电机工作原理 普通 变频两类电机区别 电动机的绝缘强度问题 谐波电磁噪声与震动 低转速时的冷却问题
  • 全面认识Linux下打包解压压缩命令

    1 前言 最近通过sudo tar czf usr src tgz usr src 这个命令发现我对打包方面的命令一无所知 故正式学习记录下 这个命令动作为 将 usr src 目录下的文件打包压缩为当前路径下的usr src tgz文件
  • Explain详解与索引最佳实践

    文章目录 Explain 解释 示范表 使用语句 explain 每一列说明 id select type table type key len ref rows EXTRA 索引最佳实践 Explain 解释 示范表 DROP TABLE