MySQL 之INDEX 索引(Index Index of MySQL)
MySQL 之INDEX 索引
1.4 INDEX 索引
1.4.1 索引介绍
索引:是排序的快速查找的特殊数据结构,定义作为查找条件的字段上,又称为键 key,索引通过存储引擎实现。
优点
-
大大加快数据的检索速度;
-
创建唯一性索引,保证数据库表中每一行数据的唯一性;
-
加速表和表之间的连接;
-
在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
缺点
-
索引需要占物理空间。
-
当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。
索引类型
-
B+ TREE、HASH、R TREE、FULL TEXT
-
聚簇(集)索引、非聚簇索引:数据和索引是否存储在一起
-
主键索引、二级(辅助)索引
-
稠密索引、稀疏索引:是否索引了每一个数据项
-
简单索引、组合索引: 是否是多个字段的索引
-
左前缀索引:取前面的字符做索引
-
覆盖索引:从索引中即可取出要查询的数据,性能高
1.4.2 索引结构
参考链接:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
树的简介
树跟数组、链表、堆栈一样,是一种数据结构。它由有限个节点,组成具有层次关系的集合。因为它看起来像一棵树,所以得其名。
树是包含n(n为整数,大于0)个结点, n-1条边的有穷集,它有以下特点
-
每个结点或者无子结点或者只有有限个子结点
-
有一个特殊的结点,它没有父结点,称为根结点
-
每一个非根节点有且只有一个父节点
-
树里面没有环路
概念相关
-
结点的度:一个结点含有的子结点个数称为该结点的度
-
树的度:一棵树中,最大结点的度称为树的度
-
父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点
-
深度:对于任意结点N,N的深度为从根到n的唯一路径长,根结点的深度为0
-
高度:对于任意结点N,N的高度为从n到一片树叶的最长路径长,所有树叶的高度为0
树的分类
按照有序性,可以分为有序树和无序树:
-
无序树:树中任意节点的子结点之间没有顺序关系
-
有序树:树中任意节点的子结点之间有顺序关系
按照节点包含子树个数,可以分为B树和二叉树,二叉树可以分为以下几种:
-
二叉树:每个节点最多含有两个子树的树称为二叉树
-
二叉查找树:首先它是一颗二叉树,若左子树不空,则左子树上所有结点的值均小于它的根结点的值;若右子树不空,则右子树上所有结点的值均大于它的根结点的值,左、右子树也分别为二叉排序树
-
满二叉树:叶节点除外的所有节点均含有两个子树的树被称为满二叉树
-
完全二叉树:如果一颗二叉树除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布
-
霍夫曼树:带权路径最短的二叉树
-
红黑树:红黑树是一种特殊的二叉查找树,每个节点都是黑色或者红色,根节点、叶子节点是黑色。如果一个节点是红色的,则它的子节点必须是黑色的
-
平衡二叉树(AVL):一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树
二叉树
二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。
参考链接:https://www.cs.usfca.edu/~galles/visualization/BST.html
红黑树
红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。
红黑树特点
-
根节点是黑色的,叶节点是不存储数据的黑色空节点
-
任何相邻的两个节点不能同时为红色,红色节点被黑色节点隔开,红色节点的子节点是黑色的
-
任意节点到其可到达的叶节点间包含相同数量的黑色节点,保证任何路径相差不会超出2倍,从而实现基本平衡
参考链接:https://www.cs.usfca.edu/~galles/visualization/RedBlack.html
B-树
B-树,读作B树,中间的横线是连字符,不是减号,B树将一个节点的大小设置为每个数据页(Page,也可以称为块,block)的大小,一般是16KB,并且,B树中是将数据和索引放在一起的,以减少IO次数,加快查询速度,一个节点能放多少数据,通常取决于一条数据占用的空间大小。
mysql> show variables like '%page_size%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| innodb_page_size | 16384 |
| large_page_size | 0 |
+------------------+-------+
2 rows in set (0.00 sec)
B+树索引
B+树是B-树的变体,也是一棵多路搜索树,MySQL普遍使用B+树来实现索引。
https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
B+树和B-树的主要区别:
-
B-树内部节点是保存数据的,而B+树内部节点是不保存数据的,只作索引作用,它的叶子节点才保存数据。
-
B+树相邻的叶子节点之间是通过链表指针连起来的,B-树却不是。
-
查找过程中,B-树在找到具体的数值以后就结束,而B+树则需要通过索引找到叶子结点中的数据才结束
-
B-树中任何一个关键字出现且只出现在一个结点中,而B+树可以出现多次。
可以使用B+Tree索引的查询类型(假设前提:姓,名,年龄三个字段建立了一个复合索引)
-
全值匹配:精确所有索引列,如:姓zhang,名ming,年龄20
-
匹配最左前缀:即只使用索引的第一列,如:姓zhang
-
匹配列前缀:只匹配一列值开头部分,如:姓以w开头的记录
-
匹配范围值:如:姓wang和姓zhang之间
-
精确匹配某一列并范围匹配另一列:如:姓wang,名以x开头的记录
-
只访问索引的查询
B+Tree索引的限制
-
如不从最左列开始,则无法使用索引,如:查找名为xiaoming,或姓为g结尾
-
不能跳过索引中的列:如:查找姓为wang,年龄30的,只能使用索引第一列
特别提示
-
索引列的顺序和查询语句的写法应相匹配,才能更好的利用索引
-
为优化性能,可能需要针对相同的列但顺序不同创建不同的索引来满足不同类型的查询需求
Hash索引
-
Hash索引:基于哈希表实现,只有精确匹配索引中的所有列的查询才有效,索引自身只存储索引列对应的哈希值和数据指针,索引结构紧凑,查询性能好。
-
Memory 存储引擎支持显式 hash 索引,InnoDB 和 MyISAM 存储引擎不支持。
-
适用场景:只支持等值比较查询,包括=,<=>,IN()。
不适合使用hash索引的场景
-
不适用于顺序查询:索引存储顺序的不是值的顺序
-
不支持模糊匹配
-
不支持范围查询
-
不支持部分索引列匹配查找:如A,B列索引,只查询A列索引无效
地理空间数据索引 R-Tree( Geospatial indexing )
MyISAM 支持地理空间索引,可使用任意维度组合查询,使用特有的函数访问,常用于做地理数据存储,使用不多。
InnoDB从MySQL5.7之后也开始支持
全文索引(FULLTEXT)
在文本中查找关键词,而不是直接比较索引中的值,类似搜索引擎
InnoDB 从 MySQL 5.6 之后也开始支持
聚簇和非聚簇索引,主键和二级索引
在 MySQL 的 InnoDB 引擎中,每个索引都会对应一棵 B+ 树,而聚簇索引和非聚簇索引最大的区别在于叶子节点存储的数据不同,聚簇索引叶子节点存储的是行数据,因此通过聚簇索引可以直接找到真正的行数据;而非聚簇索引叶子节点存储的是主键信息,所以使用非聚簇索引还需要回表查询,因此我们可以得出聚簇索引和非聚簇索引的区别主要有以下几个:
-
聚簇索引叶子节点存储的是行数据;而非聚簇索引叶子节点存储的是聚簇索引(通常是主键 ID)。
-
聚簇索引查询效率更高,而非聚簇索引需要进行回表查询,因此性能不如聚簇索引。
-
聚簇索引一般为主键索引,而主键一个表中只能有一个,因此聚簇索引一个表中也只能有一个,而非聚簇索引则没有数量上的限制。
冗余和重复索引
-
冗余索引:(A),(A,B),注意如果同时存在,仍可能会使用(A)索引
-
重复索引:已经有索引,再次建立索引
1.4.3 索引优化
参考资料:阿里的《Java开发手册》
https://developer.aliyun.com/topic/java2020
-
独立地使用列:尽量避免其参与运算,独立的列指索引列不能是表达式的一部分,也不能是函数的
-
参数,在where条件中,始终将索引列单独放在比较符号的一侧,尽量不要在列上进行运算(函数操作和表达式操作)
-
左前缀索引:构建指定索引字段的左侧的字符数,要通过索引选择性(不重复的索引值和数据表的记录总数的比值)来评估,尽量使用短索引,如果可以,应该制定一个前缀长度
-
多列索引:AND操作时更适合使用多列索引,而非为每个列创建单独的索引
-
选择合适的索引列顺序:无排序和分组时,将选择性最高放左侧
-
只要列中含有NULL值,就最好不要在此列设置索引,复合索引如果有NULL值,此列在使用时也不会使用索引
-
对于经常在where子句使用的列,最好设置索引
-
对于有多个列where或者order by子句,应该建立复合索引
-
对于like语句,以 % 或者 _ 开头的不会使用索引,以 % 结尾会使用索引
-
尽量不要使用not in和<>操作,虽然可能使用索引,但性能不高
-
不要使用RLIKE正则表达式会导致索引失效
-
查询时,能不要就不用,尽量写全字段名,比如:select id,name,age from students;
-
大部分情况连接效率远大于子查询
-
在有大量记录的表分页时使用limit
-
对于经常使用的查询,可以开启查询缓存
-
多使用explain和profile分析查询语句
-
查看慢查询日志,找出执行时间长的sql语句优化
1.4.4 管理索引
查看帮助
mysql> help index
查看索引
SHOW INDEX FROM [db_name.]tbl_name;
mysql> desc student;
+--------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+------------------+------+-----+---------+----------------+
| id | int unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| age | tinyint unsigned | YES | | NULL | |
| gender | enum('M','F') | YES | | M | |
+--------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
#默认会在主键上创建索引
mysql> show index from student\G
*************************** 1. row ***************************
Table: student
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 6
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE #B树索引
Comment:
Index_comment:
Visible: YES
Expression: NULL
1 row in set (0.01 sec)
查看语句是否利用索引
mysql> explain select * from student where id=12\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: student
partitions: NULL
type: const #只读取一次
possible_keys: PRIMARY
key: PRIMARY #使用了主键索引
key_len: 4
ref: const
rows: 1 #扫描了1条数据
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.00 sec)
mysql> explain select * from student where name="wangwu"\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: student
partitions: NULL
type: ALL #全表扫描
possible_keys: NULL #没有使用索引字段
key: NULL #没有使用索引字段
key_len: NULL
ref: NULL
rows: 6 #扫描了6条数据,整个表就是6条数据
filtered: 16.67
Extra: Using where #在存储引擎检索行后再进行过滤
1 row in set, 1 warning (0.00 sec)
创建索引
CREATE [UNIQUE] INDEX index_name ON tbl_name (index_col_name[(length)],...);
ALTER TABLE tbl_name ADD INDEX index_name(index_col_name[(length)]);
mysql> create index idx_name on student(name);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
#create index idx_name on student(name(10)); 表示取 name 字段中的前 10 个字符做索引
再次查看
mysql> show index from student\G
*************************** 1. row ***************************
Table: student
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 6
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
Visible: YES
Expression: NULL
*************************** 2. row ***************************
Table: student
Non_unique: 1
Key_name: idx_name
Seq_in_index: 1
Column_name: name
Collation: A
Cardinality: 6
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
Visible: YES
Expression: NULL
2 rows in set (0.00 sec)
再次测试
mysql> explain select * from student where name="wangwu"\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: student
partitions: NULL
type: ref
possible_keys: idx_name #使用了索引
key: idx_name #使用了索引
key_len: 62
ref: const
rows: 1 #只扫描1条数据
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.00 sec)
不是所有查询都能用到索引,B+树索引是左前缀特性,即左匹配可以使用索引
#like 查询左匹配可以使用索引
mysql> explain select * from student where name like 'g%'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: student
partitions: NULL
type: range
possible_keys: idx_name #索引
key: idx_name #索引
key_len: 62
ref: NULL
rows: 1
filtered: 100.00
Extra: Using index condition
1 row in set, 1 warning (0.00 sec)
#like 查询右匹配不使用索引
mysql> explain select * from student where name like '%g'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: student
partitions: NULL
type: ALL #全表扫描
possible_keys: NULL #不走索引
key: NULL #不走索引
key_len: NULL
ref: NULL
rows: 6
filtered: 16.67
Extra: Using where
1 row in set, 1 warning (0.00 sec)
#like 查询包含匹配不使用索引
mysql> explain select * from student where name like '%g%'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: student
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 6
filtered: 16.67
Extra: Using where
1 row in set, 1 warning (0.00 sec)
mariadb 中关于索引利用的优化
MariaDB [testdb]> select count(*) from student;
+----------+
| count(*) |
+----------+
| 28 |
+----------+
1 row in set (0.000 sec)
MariaDB [testdb]> select count(*) from student where name like 'm%';
+----------+
| count(*) |
+----------+
| 22 |
+----------+
1 row in set (0.000 sec)
MariaDB [testdb]> select count(*) from student where name like 'z%';
+----------+
| count(*) |
+----------+
| 3 |
+----------+
1 row in set (0.000 sec)
MariaDB [testdb]> show index from student\G
*************************** 1. row ***************************
Table: student
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 28
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
*************************** 2. row ***************************
Table: student
Non_unique: 1
Key_name: idx_name
Seq_in_index: 1
Column_name: name
Collation: A
Cardinality: 28
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
2 rows in set (0.001 sec)
MariaDB [testdb]> explain select * from student where name like 'm%'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: student
type: ALL #全表扫描
possible_keys: idx_name #可能会用到的索引
key: NULL #没有使用索引
key_len: NULL
ref: NULL
rows: 28
Extra: Using where
1 row in set (0.000 sec)
MariaDB [testdb]> explain select * from student where name like 'z%'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: student
type: range #范围查询
possible_keys: idx_name #可能会用到的索引
key: idx_name #实际使用了索引
key_len: 62
ref: NULL
rows: 3
Extra: Using index condition
1 row in set (0.000 sec)
全表总共28条记录,name 字段中,以 m 开头的有22条,以 z 开头的有3条,所以在此情况下,查询以 m 开头内容,直接全表扫描反而会更快
这是 mariadb 中的优化,MySQL8.0 中也有此功能,但旧版本中没有此优化
删除索引
DROP INDEX index_name ON tbl_name;
ALTER TABLE tbl_name DROP INDEX index_name(index_col_name);
#删除索引
mysql> drop index idx_name on student;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
再次测试
mysql> explain select * from student where name="wangwu"\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: student
partitions: NULL
type: ALL #全表扫描
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 6
filtered: 16.67
Extra: Using where
1 row in set, 1 warning (0.01 sec)
查看索引的使用
SET GLOBAL userstat=1;
SHOW INDEX_STATISTICS;
#仅在mariadb中使用
MariaDB [testdb]> select @@userstat;
+------------+
| @@userstat |
+------------+
| 0 |
+------------+
1 row in set (0.000 sec)
#开启
MariaDB [testdb]> SET GLOBAL userstat=1;
Query OK, 0 rows affected (0.000 sec)
#查看
MariaDB [testdb]> SHOW INDEX_STATISTICS;
Empty set (0.001 sec)
#查询
MariaDB [testdb]> select * from student where id=13;
+----+----------+------+--------+
| id | name | age | gender |
+----+----------+------+--------+
| 13 | zhangfei | 20 | F |
+----+----------+------+--------+
1 row in set (0.000 sec)
MariaDB [testdb]> select * from student where name like 'z%';
+----+-------------+------+--------+
| id | name | age | gender |
+----+-------------+------+--------+
| 13 | zhangfei | 20 | F |
| 11 | zhangsan | 12 | M |
| 16 | zhugeiliang | 39 | M |
+----+-------------+------+--------+
3 rows in set (0.001 sec)
#再次查看
MariaDB [testdb]> SHOW INDEX_STATISTICS;
+--------------+------------+------------+-----------+
| Table_schema | Table_name | Index_name | Rows_read |
+--------------+------------+------------+-----------+
| testdb | student | idx_name | 3 |
| testdb | student | PRIMARY | 1 |
+--------------+------------+------------+-----------+
2 rows in set (0.000 sec)
优化表空间
OPTIMIZE TABLE tb_name;
对 MySQL 进行大量或频繁的写操作(insert,delete,update),容易产生碎片,这些碎片会影响MySQL 性能。在此情况下,我们可以通过 optimize 命令来进行优化。此命令在使用时会锁表,需要保证在不对业务产生影响的情况下使用。
这里的碎片指的是,经过某些操作,导致数据库中的表对应的硬盘上的物理文件中的数据不是紧密排列的。
1.4.5 EXPLAIN 工具
可以通过EXPLAIN来分析索引的有效性,获取查询执行计划信息,用来查看查询优化器如何执行查询。
官方文档
https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
https://dev.mysql.com/doc/refman/8.0/en/explain-output.html
格式
EXPLAIN SELECT clause
mysql> explain select * from student where id=13\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: student
partitions: NULL
type: const
possible_keys: PRIMARY #可能用到的键
key: PRIMARY
key_len: 4
ref: const
rows: 1
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.00 sec)
EXPLAIN输出信息说明
-
id:执行编号,标识select所属的行。如果在语句中没子查询或关联查询,只有唯一的 select,每行都将显示1。否则,内层的 select 语句一般会顺序编号,对应于其在原始语句中的位置,如果explain的结果包括多个id值,则数字越大越先执行;而对于相同id的行,则表示从上往下依次执行。
-
select_type:查询类型,具体见下表。
-
table:具体查询的表名,如查 SQL 语句中定义了别名,则此处显示别名 。
-
partitions:当前查询匹配记录的分区。对于未分区的表,返回 NULL。
-
type:关联类型或访问类型,即 MySQL 决定的如何去查询表中的行的方式,具体见下表。
-
possible_keys:查询可能会用到的索引,此处列出的索引字段是在真正执行查询前的优化过程中创建的,因此有些不会被使用。
-
key:实际查询中用到的索引 。
-
key_len:实际查询中,使用索引数据中的字节数,可通过该列计算查询中使用的索引的长度,key_len 显示的值为索引字段的最大可能长度,并非实际使用长度,即 key_len 是根据表定义计算而得,不是通过表内检索出的,不损失精确性的情况下,长度越短越好 。
-
ref:当使用索引列等值查询时,与索引列进行等值匹配的对象信息,列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值,如果 ref 是一个函数,则使用的值是函数的结果。要想查看是哪个函数,可在EXPLAIN语句之后紧跟一个SHOW WARNING语句。
-
rows:为了找到所需的行而需要读取的行数,估算值,不精确。
-
filtered:按表条件过滤的行百分比,表示符合查询条件的数据百分比,最大100。用 rows × filtered 可获得和下一张表连接的行数。
-
Extra:展示有关本次查询的附加信息,具体见下表。
select_type 查询类型具体说明
关键字 | 说明 |
SIMPLE | 简单查询(没有使用 UNION 或子查询) |
PRIMARY | 最外层的查询 |
UNION | 联合查询,在 UNION 中的第二个和随后的 SELECT 被标记为 UNION,如果UNION 被 FROM 子句中的子查询包含,那么它的第一个 SELECT 会被标记为DERIVED |
DEPENDENTUNION | UNION 中的第二个或后面的查询,依赖了外层查询 |
UNION RESULT | UNION 查询结果 |
SUBQUERY | 子查询中的第一个 SELECT 查询 |
DEPENDENT SUBQUERY | 子查询中的第一个 SELECT 查询,依赖了外层查询 |
DERIVED | 用来表示包含在 FROM 子句的子查询中的 SELECT , MySQL 会递归执行并将结果放到一个临时表中,MySQL 内部将此临时表称为 DERIVED table(派生表),因为该临时表是从子查询中派生出来的 |
DEPENDENT DERIVED | 派生表,并且有依赖于其它表 |
MALTERIALIZED | 物化子查询 |
UNCACHEABLE SUBQUERY | 子查询,但结果无法缓存,必须对于外部查询的每一行重新评估 |
UNCACHEABLEUNION | UNION 属于 UNCACHEABLE SUBQUERY 的第二个或后面的查询 |
type 关联类型具体说明,性能从好到坏排序
关键字 | 说明 |
NULL | MySQL 在优化过程中分解语句,执行时甚至不用访问表或索引,此种查询最高效 |
system | 该表只有一行(相当于系统表),system 是 const 类型的特例 |
const | 针对主键或唯一索引的等值查询扫描,,最多只返回一行数据, const 查询速度非常快, 它仅仅读取一次即可。 |
eq_ref | 当使用了索引的全部组成部分,并且索引是PRIMARY KEY或UNIQUE NOT NULL 才会使用该类型 |
ref | 当满足索引的最左前缀规则,或者索引不是主键也不是唯一索引时才会发生。如果使用的索引只会匹配到少量的行 |
fulltext | 全文索引 |
ref_or_null | 该类型类似于 ref,但是 MySQL 会额外搜索哪些行包含了 NULL。这种类型常见于解析子查询。 |
index_merge | 此类型表示使用了索引合并优化,表示一个查询里面用到了多个索引 |
unique_subquery | 该类型和 eq_ref 类似,但是使用了 IN 查询,且子查询是主键或者唯一索引 |
index_subquery | 和 unique_subquery 类似,只是子查询使用的是非唯一索引 |
range | 范围扫描,表示检索了指定范围的行,主要用于有限制的索引扫描。比较常见的范围扫描是带有BETWEEN子句或WHERE子句里有>、>=、<、<=、IS NULL、<=>、BETWEEN、LIKE、IN()等操作符 |
index | 全索引扫描,和ALL类似,只不过index是全盘扫描了索引的数据。当查询仅使用索引中的一部分列时,可使用此类型 |
ALL | 全表扫描,性能最差 |
Extra 额外信息说明
关键字 | 关键字 |
Using where | 不用读取表中所有信息,仅通过索引就可以获取所需数据,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示 MySQL 服务器将在存储引擎检索行后再进行过滤。 |
Using temporary | 表示 MySQL 需要使用临时表来存储结果集,常见于排序和分组查询,常见 group by,order by。 |
Using filesort | 当 Query 中包含 order by 操作,而且无法利用索引完成的排序操作称为 “文件排序”。 |
Using join buffer | 改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。 |
Impossible where | 这个值强调了where语句会导致没有符合条件的行(通过收集统计信息不可能存在结果)。 |
Select tables optimized away | 这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行。 |
No tables used | Query语句中使用from dual 或不含任何from子句。 |
mysql> explain select * from student where id=12\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: student
partitions: NULL
type: const #只读取一次
possible_keys: PRIMARY
key: PRIMARY #使用了主键索引
key_len: 4
ref: const
rows: 1 #扫描了1条数据
filtered: 100.00
Extra: NULL
1 row in set, 1 warning (0.00 sec)
mysql> explain select * from student where name="wangwu"\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: student
partitions: NULL
type: ALL #全表扫描
possible_keys: NULL #没有使用索引字段
key: NULL #没有使用索引字段
key_len: NULL
ref: NULL
rows: 6 #扫描了6条数据,整个表就是6条数据
filtered: 16.67
Extra: Using where #在存储引擎检索行后再进行过滤
1 row in set, 1 warning (0.00 sec)
1.4.6 profile 工具
开启 profiling 设置可以记录 SQL 语句执行的详细过程
mysql> select @@profiling;
+-------------+
| @@profiling |
+-------------+
| 0 |
+-------------+
1 row in set, 1 warning (0.00 sec)
#无记录
mysql> show profiles;
Empty set, 1 warning (0.00 sec)
#开启
mysql> set profiling=1;
Query OK, 0 rows affected, 1 warning (0.00 sec)
#执行SQL语句
mysql> select * from student where name="wangwu";
+----+--------+------+--------+
| id | name | age | gender |
+----+--------+------+--------+
| 12 | wangwu | 13 | M |
+----+--------+------+--------+
1 row in set (0.00 sec)
#再次查看
mysql> show profiles;
+----------+------------+-------------------------------------------+
| Query_ID | Duration | Query |
+----------+------------+-------------------------------------------+
| 1 | 0.00091900 | select * from student where name="wangwu" |
+----------+------------+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)
#删除索引
mysql> drop index idx_name on student;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
#再次查询
mysql> select * from student where name="wangwu";
+----+--------+------+--------+
| id | name | age | gender |
+----+--------+------+--------+
| 12 | wangwu | 13 | M |
+----+--------+------+--------+
1 row in set (0.01 sec)
#两次用时对比
mysql> show profiles;
+----------+------------+-------------------------------------------+
| Query_ID | Duration | Query |
+----------+------------+-------------------------------------------+
| 1 | 0.00091900 | select * from student where name="wangwu" |
| 2 | 0.01600600 | drop index idx_name on student |
| 3 | 0.00112750 | select * from student where name="wangwu" | #数据量太小,不能体现索引优势
+----------+------------+-------------------------------------------+
3 rows in set, 1 warning (0.00 sec)
导入大表再次对比
[root@rocky86 ~]# cat testlog.sql
create table testlog (id int auto_increment primary key,name char(10),salary int default 20);
delimiter $$
create procedure sp_testlog()
begin
declare i int;
set i = 1;
while i <= 100000
do insert into testlog(name,salary) values (concat('wang',FLOOR(RAND() * 100000)),FLOOR(RAND() * 1000000));
set i = i +1;
end while;
end$$
delimiter;
#导入
[root@rocky86 ~]# mysql testdb < testlog.sql
mysql> use testdb;
Database changed
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| student |
| t1 |
| testlog |
+------------------+
3 rows in set (0.00 sec)
mysql> select count(*) from testlog;
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.01 sec)
#执行存储过程
mysql> call sp_testlog;
Query OK, 1 row affected (1 min 2.02 sec)
mysql> select count(*) from testlog;
+----------+
| count(*) |
+----------+
| 100000 |
+----------+
1 row in set (0.01 sec)
#查询
mysql> select * from testlog limit 5;
+----+-----------+--------+
| id | name | salary |
+----+-----------+--------+
| 1 | wang64276 | 606675 |
| 2 | wang10506 | 705314 |
| 3 | wang21136 | 940888 |
| 4 | wang7034 | 529049 |
| 5 | wang43421 | 583940 |
+----+-----------+--------+
5 rows in set (0.00 sec)
#默认主键索引
mysql> show index from testlog\G;
*************************** 1. row ***************************
Table: testlog
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 98399
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:
Visible: YES
Expression: NULL
1 row in set (0.00 sec)
#查询
mysql> select * from testlog where salary=583940;
+----+-----------+--------+
| id | name | salary |
+----+-----------+--------+
| 5 | wang43421 | 583940 |
+----+-----------+--------+
1 row in set (0.01 sec)
#查看索引使用情况
mysql> explain select * from testlog where salary=583940\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: testlog
partitions: NULL
type: ALL #全表扫描
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 98399
filtered: 10.00
Extra: Using where
1 row in set, 1 warning (0.00 sec)
#查看执行时间
mysql> show profiles;
+----------+------------+-------------------------------------------+
| Query_ID | Duration | Query |
+----------+------------+-------------------------------------------+
| 1 | 0.01881575 | select * from testlog where salary=583940 |
+----------+------------+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)
#在salary列创建索引
mysql> create index idx_salary on testlog(salary);
Query OK, 0 rows affected (0.16 sec)
Records: 0 Duplicates: 0 Warnings: 0
#再次查询
mysql> select * from testlog where salary=529049;
+----+----------+--------+
| id | name | salary |
+----+----------+--------+
| 4 | wang7034 | 529049 |
+----+----------+--------+
1 row in set (0.00 sec)
#对比
mysql> show profiles;
+----------+------------+--------------------------------------------+
| Query_ID | Duration | Query |
+----------+------------+--------------------------------------------+
| 1 | 0.01881575 | select * from testlog where salary=583940 |
| 2 | 0.15655150 | create index idx_salary on testlog(salary) |
| 3 | 0.00038900 | select * from testlog where salary=529049 |
+----------+------------+--------------------------------------------+
3 rows in set, 1 warning (0.00 sec)
mysql> explain select * from testlog where salary=529049\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: testlog
partitions: NULL
type: ref
possible_keys: idx_salary
key: idx_salary
key_len: 5
ref: const
rows: 1 #只扫描1条记录
filtered: 100.00
Extra: NULL1 row in set, 1 warning (0.00 sec)
相关文章:
MySQL 之INDEX 索引(Index Index of MySQL)
MySQL 之INDEX 索引 1.4 INDEX 索引 1.4.1 索引介绍 索引:是排序的快速查找的特殊数据结构,定义作为查找条件的字段上,又称为键 key,索引通过存储引擎实现。 优点 大大加快数据的检索速度; 创建唯一性索引,保证数…...
Linux驱动学习(二)--字符设备
设备分类 字符设备块设备网络设备 内核结构图: 字符设备号 字符设备号是32位的无符号整型值 高12位:主设备号低20位:次设备号 查看设备号 cat /proc/devices 设备号构造 直接使用宏MKDEV #define MKDEV(ma,mi) (((ma) << MINORBITS…...
计算机毕业设计--基于深度学习技术(Yolov11、v8、v7、v5)算法的高效人脸检测模型设计与实现(含Github代码+Web端在线体验界面)
基于深度学习技术(Yolov11、v8、v7、v5)算法的高效人脸检测模型 Yolo算法应用之《基于Yolo的花卉识别算法模型设计》,请参考这篇CSDN作品👇 计算机毕业设计–基于深度学习技术(Yolov11、v8、v7、v5)算法的…...
leetcode-414.第三大的数
leetcode-414.第三大的数 code review! 文章目录 leetcode-414.第三大的数一.题目描述二.代码提交 一.题目描述 二.代码提交 class Solution { public:int thirdMax(vector<int>& nums) {set<int> set_v(nums.begin(), nums.end());auto it set_v.rbegin()…...
使用API有效率地管理Dynadot域名,参与过期域名竞价
关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…...
iOS 上自定义编译 FFmpeg
在 iOS 上自定义编译 FFmpeg 是一个复杂但非常灵活的过程。通过自定义编译,您可以选择启用或禁用特定的功能和编解码器,以满足项目的需求,同时减少二进制文件的大小。 1. 自定义编译 FFmpeg 1.1 准备工作 在开始编译之前,您需要以下工具和环境: macOS:运行编译的主机。…...
解锁 JavaScript 异步编程:Promise 链式操作、async/await 与 Promise.all 深度剖析
1.引言 在 JavaScript 的世界里,异步编程是一个核心且关键的概念。随着 Web 应用的复杂度不断提升,处理多个异步操作的需求也日益增长。传统的回调函数方式容易陷入 “回调地狱”,让代码的可读性和可维护性大打折扣。而 Promise 的出现为异步编程带来了新的曙光,后续又衍生…...
30 款 Windows 和 Mac 下的复制粘贴软件对比
在日常电脑操作中,复制粘贴是极为高频的操作,一款好用的复制粘贴软件能极大提升工作效率。以下为你详细介绍 30 款 Windows 和 Mac 下的复制粘贴软件,并对比它们的优缺点,同时附上官网下载地址,方便大家获取软件。 Pa…...
复现论文:DPStyler: Dynamic PromptStyler for Source-Free Domain Generalization
论文:[2403.16697] DPStyler: Dynamic PromptStyler for Source-Free Domain Generalization github: TYLfromSEU/DPStyler: DPStyler: Dynamic PromptStyler for Source-Free Domain Generalization 论文: 这篇论文还是在PromptStyler:Prompt-driven Style Gener…...
【数据库维护】Clickhouse数据库维护关键系统表相关指标说明,支撑定位慢SQL及多实例场景下分析各实例运行情况
背景 当前使用环境上以Docker容器化部署Clickhouse服务8个实例,但在实际运行过程中,发现8个实例内存负载不均衡,ck-0实例在固定时间段内存会直线上升,直至服务报错memory exceeded max memory limit。 为排查ck-0节点内存直线上升…...
java爬虫抓取网页搜索数据
首先访问这个使用必应并搜索想要的内容 https://www.bing.com/images/search?q[把这里替换成想要的搜索内容] 按下f12来查看源码 我们可以找到a.iusc这个元素可以获取图片的源地址 注意,直接选中网页上的图片只能看到它的缩略图在哪。 由此可以编写出来爬虫脚本来…...
智能编程助手功能革新与价值重塑之:GitHub Copilot
引言: GitHub Copilot 的最新更新为开发者带来了显著变化,其中 Agent Mode 功能尤为引人注目。该模式能够自动识别并修复代码错误、自动生成终端命令,并具备多级任务推理能力,这使得开发者在开发复杂功能时,可大幅减少…...
Linux3-文件io、时间有关函数
一、前情回顾 1.当scanf输入10\n直接结束程序,因为scanf接收了10,fgets(接收了\n结束程序), 因此可以加一个getchar();消耗一个\n。 2.fgets();所接收的\n利用buff[strlen(buff)-1]0; 二、文件io 1.目的:…...
VScode运行C语言提示“#Include错误,无法打开源文件stdio.h”
C/C环境配置 参考: VS Code 配置 C/C 编程运行环境(保姆级教程)_vscode配置c环境-CSDN博客 基本步骤 - 安装MinGW-W64,其包含 GCC 编译器:bin目录添加到环境变量;CMD 中输入gcc --version或where gcc验证…...
【Linux】线程全解:概念、操作、互斥与同步机制、线程池实现
🎬 个人主页:谁在夜里看海. 📖 个人专栏:《C系列》《Linux系列》《算法系列》 ⛰️ 道阻且长,行则将至 目录 📚一、线程概念 📖 回顾进程 📖 引入线程 📖 总结 &a…...
【第4章:循环神经网络(RNN)与长短时记忆网络(LSTM)— 4.3 RNN与LSTM在自然语言处理中的应用案例】
咱今天来聊聊在人工智能领域里,特别重要的两个神经网络:循环神经网络(RNN)和长短时记忆网络(LSTM),主要讲讲它们在自然语言处理里的应用。你想想,平常咱们用手机和别人聊天、看新闻、听语音助手说话,背后说不定就有 RNN 和 LSTM 在帮忙呢! 二、RNN 是什么? (一)…...
平板作为电脑拓展屏
有线串流(速度更快) spacedesk 打开usb对安卓的连接 用usb线直接连接电脑和平板 无线串流(延迟高,不推荐) todesk pc和手机端同时下载软件,连接后可以进行远程控制或扩展屏幕 spacedesk 连接到同一个…...
【Spring+MyBatis】留言墙的实现
目录 1. 添加依赖 2. 配置数据库 2.1 创建数据库与数据表 2.2 创建与数据库对应的实体类 3. 后端代码 3.1 目录结构 3.2 MessageController类 3.3 MessageService类 3.4 MessageMapper接口 4. 前端代码 5. 单元测试 5.1 后端接口测试 5.2 使用前端页面测试 在Spri…...
Redis的简单使用
1.Redis的安装Ubuntu安装Redis-CSDN博客 2.Redis在Spring Boot 3 下的使用 2.1 pom.xml <!-- Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifac…...
IDEA集成DeepSeek AI助手完整指南
在当今快速发展的软件开发领域,AI辅助编程工具正在成为开发者的重要助手。本文将详细介绍如何在IDEA中集成DeepSeek AI助手,帮助开发者提升编程效率。 一、环境准备 © ivwdcwso (ID: u012172506) 1.1 IDEA版本要求 在开始集成之前,需要确保你的IDEA版本满足要求: …...
rust学习笔记1-window安装开发环境
1.登录官网下载https://www.rust-lang.org/zh-CN/tools/install 下载 rustup-init.exe。 2.设置环境变量 (1)在指定路径新建.cargo和.rustup文件夹 CARGO_HOME RUSTUP_HOME (2)配置rustup下载源镜像 提高rust安装组件下载速…...
【钱包】【WEB3】【Flutter】一组助记词如何推导多个账号钱包
一、前言 一组助记词可以推导多个账户,是因为在区块链钱包中,助记词(Mnemonic)实际上是 BIP39 标准下生成的一个种子,该种子通过 BIP32/BIP44 标准可以派生出无限多个账户地址。 这里我将以太坊Ethereum为例…...
基于SSM+Vue的智能汽车租赁平台设计和实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...
Zotero PDF Translate插件配置百度翻译api
Zotero PDF Translate插件可以使用几种翻译api,虽然谷歌最好用,但是由于众所周知的原因,不稳定。而cnki有字数限制,有道有时也不行。其他的翻译需要申请密钥。本文以百度为例,进行申请 官方有申请教程: Zot…...
深度学习05 ResNet残差网络
目录 传统卷积神经网络存在的问题 如何解决 批量归一化BatchNormalization, BN 残差连接方式 残差结构 ResNet网络 ResNet 网络是在 2015年 由微软实验室中的何凯明等几位大神提出,斩获当年ImageNet竞赛中分类任务第一名,目标检测第一名。获得CO…...
【Python项目】文本相似度计算系统
【Python项目】文本相似度计算系统 技术简介:采用Python技术、Django技术、MYSQL数据库等实现。 系统简介:本系统基于Django进行开发,包含前端和后端两个部分。前端基于Bootstrap框架进行开发,主要包括系统首页,文本分…...
【ISO 14229-1:2023 UDS诊断(ECU复位0x11服务)测试用例CAPL代码全解析④】
ISO 14229-1:2023 UDS诊断【ECU复位0x11服务】_TestCase04 作者:车端域控测试工程师 更新日期:2025年02月17日 关键词:UDS诊断协议、ECU复位服务、0x11服务、ISO 14229-1:2023 TC11-004测试用例 用例ID测试场景验证要点参考条款预期结果TC…...
机器学习:k近邻
所有代码和文档均在golitter/Decoding-ML-Top10: 使用 Python 优雅地实现机器学习十大经典算法。 (github.com),欢迎查看。 K 邻近算法(K-Nearest Neighbors,简称 KNN)是一种经典的机器学习算法,主要用于分类和回归任务…...
Pytorch实现论文之一种基于扰动卷积层和梯度归一化的生成对抗网络
简介 简介:提出了一种针对鉴别器的梯度惩罚方法和在鉴别器中采用扰动卷积,拟解决锐梯度空间引起的训练不稳定性问题和判别器的记忆问题。 论文题目:A Perturbed Convolutional Layer and Gradient Normalization based Generative Adversarial Network(一种基于扰动卷积层…...
Golang 面试题
常见的 Go 语言面试题及其答案和代码示例: 一、高频面试题 1. Goroutine 和线程的区别? 答案: Goroutine 是 Go 语言中的轻量级线程,由 Go 运行时管理,初始栈大小约为 2KB,可以动态扩展和收缩,创建和切换成本非常低。线程 是操作系统级别的线程,栈大小通常为 MB 级,…...
数据结构-栈、队列、哈希表
1栈 1.栈的概念 1.1栈:在表尾插入和删除操作受限的线性表 1.2栈逻辑结构: 线性结构(一对一) 1.3栈的存储结构:顺序存储(顺序栈)、链表存储(链栈) 1.4栈的特点: 先进后出(fisrt in last out FILO表),后进先出 //创建栈 Stacklist create_stack() {Stacklist lis…...
newgrp docker需要每次刷新问题
每次都需要运行 newgrp docker 的原因: 当用户被添加到 docker 组后,当前会话并不会立即更新组信息,因此需要通过 newgrp docker 切换到新的用户组以使权限生效 如果不想每次都手动运行 newgrp docker,可以在终端中配置一个自动刷新的脚本。…...
JAVA Kotlin Androd 使用String.format()格式化日期
在以前的开发中,日期格式化一直使用的是SimpleDateFormat进行格式化。今天发现String.format也可以格式化。当 然,两种方式的优劣没有进行深入分析。 val date Date()//月,日,星期,AM/PM//Fue 1 (Sat) pmval fullDate…...
Python----数据结构(单链表:节点,是否为空,长度,遍历,添加,删除,查找)
一、链表 链表是一种线性数据结构,由一系列按特定顺序排列的节点组成,这些节点通过指针相互连接。每个节点包含两部分:元素和指向下一个节点的指针。其中,最简单的形式是单向链表,每个节点含有一个信息域和一个指针域&…...
腾讯的webUI怎样实现deepseek外部调用 ; 腾讯云通过API怎样调用deepseek
腾讯的webUI怎样实现deepseek外部调用 目录 腾讯的webUI怎样实现deepseek外部调用腾讯云通过API怎样调用deepseekhtml方式curl方式python方式腾讯云通过API怎样调用deepseek 重点说明:不需要SK,仅仅使用ip和端口号 html方式 <!DOCTYPE html> <html lang="e…...
基于Spring Boot的社区居民健康管理平台的设计与实现
目录 1 绪论 1.1 研究现状 1.2 研究意义 1.3 组织结构 2 技术介绍 2.1 平台开发工具和环境 2.2 Vue介绍 2.3 Spring Boot 2.4 MyBatis 2.5 环境搭建 3 系统需求分析 3.1 可行性分析 3.2 功能需求分析 3.3 系统用例图 3.4 系统功能图 4 系统设计 4.1 系统总体描…...
网络编程(24)——实现带参数的http-get请求
文章目录 二十四、day241. char 转为16进制2. 16进制转为 char3. URL 编码函数4. URL 解码函数5. 实现 get 请求参数的解析6. 测试 二十四、day24 我们在前文通过beast实现了http服务器的简单搭建,但是有很多问题我们并没有解决。 在前文中,我们的 get…...
使用 Openpyxl 操作 Excel 文件详解
文章目录 安装安装Python3安装 openpyxl 基础操作1. 引入2. 创建工作簿和工作表3. 写入数据4. 保存工作簿5. 加载已存在的Excel6. 读取单元格的值7. 选择工作表 样式和格式化1. 引入2. 设置字体3. 设置边框4. 填充5. 设置数字格式6. 数据验证7. 公式操作 性能优化1. read_only/…...
力扣 买卖股票的最佳时机
贪心算法典型例题。 题目 做过股票交易的都知道,想获取最大利润,就得从最低点买入,最高点卖出。这题刚好可以用暴力,一个数组中找到最大的数跟最小的数,然后注意一下最小的数在最大的数前面即可。从一个数组中选两个数…...
前端监控的具体实现细节
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
ES8中 async 和await的用法详细的总结
async 和 await 是 ES8(ECMAScript 2017)引入的两个关键字,用于处理异步操作。它们基于 Promise,使得异步代码的编写和阅读变得更加简洁和直观。通过这两个关键字,开发者可以避免回调地狱(callback hell&am…...
一键终结环境配置难题:ServBay 1.9 革新 AI 模型本地部署体验
### 一键终结环境配置难题:ServBay 1.9 革新 AI 模型本地部署体验 还在为反复折腾 Ollama 安装命令、配置环境变量而头疼?**ServBay 1.9** 的发布,彻底改变了本地 AI 模型部署的复杂流程。这款原本以“3分钟搭建 Web 开发环境”著称的工具&a…...
[数据结构]红黑树,详细图解插入
目录 一、红黑树的概念 二、红黑树的性质 三、红黑树节点的定义 四、红黑树的插入(步骤) 1.为什么新插入的节点必须给红色? 2、插入红色节点后,判定红黑树性质是否被破坏 五、插入出现连续红节点情况分析图解(看…...
springmvc(13/158)
太感动了,搞了半天以为是 这个dispatcherservlet报错的问题,结果是我第一次改springmvc-servlet.xml里面的后缀出了问题。 <servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.D…...
【javascript】录音可视化
文章目录 前言一、音频数据格式1. 常见的数据格式 二、获取音频方式1. 用FileReader对象读取音频文件2. 通过url请求获取音频数据3. 录音获取音频流 三、音频格式转换1. buffer和blob互相转换2. blob转base643. base64转Uint8Array 四、音频可视化五、大文件上传1. 固定大小分片…...
解锁机器学习核心算法 | K-平均:揭开K-平均算法的神秘面纱
一、引言 机器学习算法种类繁多,它们各自有着独特的优势和应用场景。前面我们学习了线性回归算法、逻辑回归算法、决策树算法。而今天,我们要深入探讨的是其中一种经典且广泛应用的聚类算法 —— K - 平均算法(K-Means Algorithm)…...
Go入门之语言变量 常量介绍
func main(){var a int8 10var b int 5var c int 6fmt.Println("a", a, "b", b, "c", c)d : 10fmt.Printf("a%v leixing%T\n", d, d) } main函数是入口函数,fmt包有三个打印的函数Println,Print,Printf。第…...
音频采集(VUE3+JAVA)
vue部分代码 xx.vue import Recorder from ./Recorder.js; export default {data() {return {mediaStream: null,recorder: null,isRecording: false,audioChunks: [],vadInterval: null // 新增:用于存储声音活动检测的间隔 ID};},async mounted() {this.mediaSt…...
Linux运维篇-存储基础知识
什么是存储 用于存放数据信息的设备和介质,等同于计算机系统中的外部存储,是一个完整的系统。 存储的结构和趋势 存储的体系结构 当前存储的主要体系结构有三种: DASNASSAN 存储的发展趋势 ssd固态硬盘云存储一体化应用存储设备非结构…...
【git】已上传虚拟环境的项目更改成不再上传虚拟环境
虽然git用了很长时间,但是距离精通还是太远了。注意到虚拟环境是因为上传项目时用到的系统是macOS,而拉取项目时用到的系统是win,意识到是时候学习知识了(好懒啊)。 头一次上传:使用.gitignore避免虚拟环境…...