烟台网站排行榜/图片外链生成工具在线
一、存储引擎
1、MYSQL体系结构
连接层、服务层、引擎层、存储层;
2、存储引擎简介
存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是库的,所以存储引擎也可被称为表类型。
1)在创建表时指定存储引擎
CREATE TABLE 表名(字段1名 字段1类型 [COMMENT 字段1注释],……字段n名 字段n类型 [COMMENT 字段n注释]
)ENGINE=INNODB [COMMENT 表注释]
2)查看数据库引擎
--查看数据库的引擎mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ndbcluster | NO | Clustered, fault-tolerant tables | NULL | NULL | NULL |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| ndbinfo | NO | MySQL Cluster system information storage engine | NULL | NULL | NULL |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
11 rows in set (0.04 sec)
--查看数据库中某个表使用的什么存储引擎show create table xxx;
3、存储引擎特点
(一)INNODB
1)介绍:
InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在Mysql 5.5之后,InnoDB是mysql默认的存储引擎
2)特点:
DML操作遵循ACID模型,支持事务;
行级锁,支持并发访问性能;
支持外键FOREIGN KEY约束,保证数据完整性和正确性;
3)文件:
xxx.ibd :xxx是文件名,InnoDB引擎的每张表都对应这样一个表空间文件,存储该表的表结构(frm、sdi)、数据和索引
参数:innodb_file_per_table
使用命令可查看idb文件中的文件结构
ibd2sdi xxx.ibd
-- 查看变量,每个表一个文件,8.0版本之后默认是ON
mysql> show variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.01 sec)
4)逻辑存储结构
表空间:TableSpace
段:Segment
区:Extent 默认大小 1M 包含64个页
页:Page 默认大小 16K
行:Row
(二)MyISAM
1)介绍:
MyISAM是MYSQL早期默认存储引擎。
2)特点:
不支持事务,不支持外键;
支持表锁,不支持行锁;
访问速度快;
3) 文件:
xxx.sdi:存储表结构信息
xxx.MYD:存储数据
xxx.MYI:存储索引
(三)Memory
1)介绍:
Memory存储引擎的表数据是存储在内存中的,受到断电问题、或硬件问题的影响,只能将这些表作为临时表或者缓存使用。
2)特点:
内存存放
Hash索引(默认)
3)文件:
xxx.sdi:存放表结构信息
4、存储引擎选择
根据应用系统特点选择存储引擎,对于复杂应用,可以根据实际情况,选择多种存储引擎的组合。
InnoDB:mysql默认存储引擎,支持事务和外键。如果应用对事务的完整性有较高要求,在并发条件下要求数据一致性,数据操作除了插入和查询之外,还有很多更新和删除操作,那么innoDB存储引擎是比较合适的选择。
MyISAM:如果数据以插入和查询为主,对数据的更新和删除较少,并且对事务的完整性和并发性要求不高,选择这个存储引擎比较合适。
Memory:将所有数据保存到内存中,访问速度快,通常用于临时表及缓存。memory对表的大小有限制,太大的表无法缓存到内存中,而且无法保证数据的安全性。
二、索引
1、索引概述
介绍:
索引是帮助mysql高效获取数据的一种数据结构(有序的)。在数据之外,数据库还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
优缺点:
优势 | 劣势 |
---|---|
提高数据检索效率,降低数据库的IO成本 | 索引也是要暂用存储空间的 |
通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗 | 索引大大提高了查询效率,同时降低了更新表的速度,如对表进行INSERT、UPDATE、DELETE时,效率降低。 |
2、索引结构
索引结构 | 描述 |
---|---|
B+Tree索引 | 最常见的索引类型,大部分存储引擎都支持B+树索引 |
Hash索引 | 底层数据结构使用hash表实现的,只有精确匹配索引列的查询才有效,不支持范围查询 |
R-Tree(空间索引) | 空间索引是MyISAM引擎的一种特殊索引类型,主要用于地理空间数据类型,用的较少 |
Full-text(全文索引) | 是一种通过建立倒排索引,快速匹配文档的方式。类似于Lucene、Solr、ES |
索引支持情况
索引 | InnoDB | MyISAM | Memory |
---|---|---|---|
B+Tree索引你 | 支持 | 支持 | 支持 |
Hash索引 | 不支持 | 不支持 | 支持 |
R-Tree索引 | 不支持 | 支持 | 不支持 |
Full-text全文索引 | 5.6版本之后支持 | 支持 | 不支持 |
我们平时说的索引结构,如果不做特殊说明都是指B+Tree索引。
1)二叉树
左小右大的二叉树
缺点:
1)顺序插入时,会形成一个链表,查询性能大大降低。
2)大数据量情况下,层级较深,检索速度慢。
2)红黑树
使用红黑树,解决二叉树的平衡问题(第一个问题),但是问题二依然存在
大数据量情况下,层级较深,检索速度慢。
3)B树(多路平衡查找树)
以一颗最大度数(max-degree)为5(5阶)的B-Tree为例(每个节点最多存储4个key,5个指针)
树的度数:指的是一个节点的最大子节点个数。
4)B+树
相对于B-Tree特点:
1)所有数据都出现在叶子节点,非叶子节点只起到索引作用
2)叶子节点是个单向链表
以一个最大度数为4(4阶)的B+树为例
Mysql索引数据结构对经典的B+Tree进行了优化,在原B+Tree的基础上,增加了一个指向相邻叶子节点的链表指针,就形成了一个带有顺序指针的B+Tree,提高了区间访问的性能。
5)Hash
哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在哈希表中。
如果两个或者多个键值,映射到一个相同的槽位上,他们就产生了哈希冲突(也成为哈希碰撞),可以通过链表来解决。
hash索引特点
1)只能用于对等比较(=,in),不支持范围查询
2)无法利用索引完成排序操作
3)查询效率高,通常只需要一次检索就可以了,效率通常要高于B+Tree索引
存储引擎支持
在mysql中,支持hash索引的是memory引擎,而InnoDB中具有自适应hash功能,hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的。
6)为什么InnoDB采用B+Tree索引结构
1)相对于二叉树层级更少,搜索效率更高。
2)对于B-树,无论是叶子结点还是非叶子节点,都会保存数据,这样导致一页存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加数的高度,导致性能下降。
3)对于Hash索引,B+Tree支持范围查找及排序操作。
3、索引分类
分类 | 含义 | 特点 | 关键字 |
---|---|---|---|
主键索引 | 针对于表中主键创建的索引 | 默认自动创建,只能有一个 | primary |
唯一索引 | 避免表中某个列的值数据重复 | 可以有多个 | unique |
普通索引 | 快速定位特定数据 | 可以有多个 | |
全文索引 | 全文索引查找的是文本中的关键词,而不是比较索引中的值 | 可以有多个 | fulltext |
在InnoDB存储引擎中,根据索引的存储形式又可以分为以下两种
分类 | 含义 | 特点 |
---|---|---|
聚集索引(Clustered Index) | 将数据存储于索引结构放到一块,索引结构的叶子节点保存了行数据 | 必须有,而且只有一个 |
二级索引(Secondary Index) | 将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键 | 可以存在多个 |
聚集索引选取规则
1)如果存在主键,主键索引就是聚集索引
2)如果没有主键,将使用第一个唯一索引(UNIQUE)作为聚集索引
3)如果表没有主键或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引
思考:
InnoDB主键索引的B+Tree高度为多高?
假设:
一行数据大小为1k,一页中可以存储16行这样的数据,InnoDB的指针暂用6个字节的空间,主键即使是BigInt,暂用字节数为8
高度为2:
n*8+(n+1)*6 =16*1024 算出n约为1170
1171*16=18736
高度为3:
1171*1171*16=2193,9856 ≈ 2200万
4、索引语法
--创建索引
CREATE [UNIQUE|FULLTEXT] INDEX index_name ON table_name(index_col_name……);
--查看索引
SHOW INDEX FROM table_name;
--删除索引
DROP INDEX index_name ON table_name
5、sql性能分析
(一)SQL执行频率
Msql客户端连接成功后,通过命令show 【session|global】status 可以提供服务器状态信息,通过如下指令可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT访问频次。如果没有select查询或者很少的查询操作,就没必要做优化。
show global status like 'Com_______' 7个下划线
--查看各种语句使用频率
mysql> show global status like 'Com_______'-> ;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_binlog | 0 |
| Com_commit | 4 |
| Com_delete | 0 |
| Com_import | 0 |
| Com_insert | 8 |
| Com_repair | 0 |
| Com_revoke | 2 |
| Com_select | 263 |
| Com_signal | 0 |
| Com_update | 10 |
| Com_xa_end | 0 |
+---------------+-------+
11 rows in set (0.01 sec)
(二)慢查询日志
1)查看慢查询日志是否开启
show ariables like ‘slow_query_log’
--查看慢查询日志开关是否开启,默认是关闭
mysql> show variables like 'slow_query_log';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| slow_query_log | OFF |
+----------------+-------+
1 row in set (0.02 sec)
慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有sql语句日志。
2)开启慢查询
mysql的慢查询日志默认没有开启,需要在MYSQL配置文件(/etc/my.cnf)中配置如下信息:
--开启mysql慢查询日志开关
slow_query_log=1
--设置慢日志的时间为2秒,sql语句执行时间超过两秒,就会视为慢查询,记录慢查询日志
long_query_time=2
3)查看慢查询
配置完毕后,通过以下指令,重启mysql服务器进行测试,查看慢日志记录文件中记录的信息/var/lib/mysql/localhost-slow.log
(三)profile详情
show profiles命令在做sql优化时,能够帮我们了解每一条sql时间都耗费到哪里去了。通过have_profiling参数,能够看到当前mysql是否支持profile操作:
1)是否支持profile操作
select @@have_profiling;
默认profiling是关闭的,
2) 查看profiling是否开启
select @@profiling;
3)开启profile
可以在session|global级别开启profiling:
set profiling=1;
--当前mysql是否支持profile操作
mysql> select @@have_profiling;
+------------------+
| @@have_profiling |
+------------------+
| YES |
+------------------+
1 row in set, 1 warning (0.00 sec)--查看profiling开关是否开启,默认是关闭状态。 1表示开启,0表示关闭。
mysql> select @@profiling;
+-------------+
| @@profiling |
+-------------+
| 0 |
+-------------+
1 row in set, 1 warning (0.00 sec)mysql> show profiles;
Empty set, 1 warning (0.00 sec)--打开profile详情mysql> set profiling=1;
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> select @@profiling;
+-------------+
| @@profiling |
+-------------+
| 1 |
+-------------+
1 row in set, 1 warning (0.01 sec)
4)查看每一条sql语句耗时情况
开启profiling开关之后,通过如下指令,查看指令的执行耗时。
show profiles;
5)查看每个极端耗时情况
--查看指定query_id的查询语句每个阶段的耗时情况
show profile query for query_id;
6)查看每个阶段CPU使用情况
--查看指定query_id的sql语句cpu使用情况;
show profile cpu query for query_id;
7)下面是使用示例
--查看每一条sql耗时基本情况
show profiles;
--查看指定query_id的查询语句每个阶段的耗时情况
show profile query for query_id;--查看指定query_id的SQL语句CPU的使用情况
show profile cpu for query query_id;--执行一些sql语句,供后面查询用
mysql> select * from account;
+----+--------+-------+
| id | name | money |
+----+--------+-------+
| 1 | 张三 | 2000 |
| 2 | 李四 | 2000 |
+----+--------+-------+
2 rows in set (0.00 sec)mysql> select * from t01;
Empty set (0.00 sec)mysql> select * from user;
+----+--------+----------+
| id | name | password |
+----+--------+----------+
| 1 | 张三 | 123 |
| 2 | 李四 | 123 |
| 3 | 王五 | 123 |
| 4 | 王五 | 123 |
| 5 | NULL | 123456 |
| 6 | doumi | 123456 |
+----+--------+----------+
6 rows in set (0.00 sec)mysql> select * from user where id=3-> ;
+----+--------+----------+
| id | name | password |
+----+--------+----------+
| 3 | 王五 | 123 |
+----+--------+----------+
1 row in set (0.00 sec)mysql> select * from user where name='doumi';
+----+-------+----------+
| id | name | password |
+----+-------+----------+
| 6 | doumi | 123456 |
+----+-------+----------+
1 row in set (0.00 sec)
--查看每一条SQL的耗时情况
查看每条sql语句执行耗时情况
show profiles;
mysql> show profiles;
+----------+------------+---------------------------------------+
| Query_ID | Duration | Query |
+----------+------------+---------------------------------------+
| 1 | 0.01071200 | show tables |
| 2 | 0.00215000 | select * from account |
| 3 | 0.00290200 | select * from t01 |
| 4 | 0.00397000 | select * from user |
| 5 | 0.00320600 | select * from user where id=3 |
| 6 | 0.00151600 | select * from user where name='doumi' |
+----------+------------+---------------------------------------+
6 rows in set, 1 warning (0.00 sec)
show profile for query 6; -- 6是上面show profiles命令结果中的query_id
--查看query_id 为6的那条sql语句每个阶段的耗时情况
mysql> show profile for query 6;
+--------------------------------+----------+
| Status | Duration |
+--------------------------------+----------+
| starting | 0.000087 |
| Executing hook on transaction | 0.000009 |
| starting | 0.000008 |
| checking permissions | 0.000007 |
| Opening tables | 0.000045 |
| init | 0.000008 |
| System lock | 0.000009 |
| optimizing | 0.000943 |
| statistics | 0.000060 |
| preparing | 0.000111 |
| executing | 0.000102 |
| end | 0.000007 |
| query end | 0.000005 |
| waiting for handler commit | 0.000012 |
| closing tables | 0.000011 |
| freeing items | 0.000034 |
| cleaning up | 0.000058 |
+--------------------------------+----------+
17 rows in set, 1 warning (0.01 sec)
show profile cpu for query 6; -- 6是上面show profiles命令结果中的query_id
--查看query_id为6的那条sql语句CPU消耗情况
mysql> show profile cpu for query 6;
+--------------------------------+----------+----------+------------+
| Status | Duration | CPU_user | CPU_system |
+--------------------------------+----------+----------+------------+
| starting | 0.000087 | 0.000073 | 0.000013 |
| Executing hook on transaction | 0.000009 | 0.000003 | 0.000007 |
| starting | 0.000008 | 0.000006 | 0.000002 |
| checking permissions | 0.000007 | 0.000004 | 0.000003 |
| Opening tables | 0.000045 | 0.000043 | 0.000002 |
| init | 0.000008 | 0.000003 | 0.000005 |
| System lock | 0.000009 | 0.000007 | 0.000002 |
| optimizing | 0.000943 | 0.000023 | 0.000175 |
| statistics | 0.000060 | 0.000043 | 0.000016 |
| preparing | 0.000111 | 0.000043 | 0.000068 |
| executing | 0.000102 | 0.000096 | 0.000006 |
| end | 0.000007 | 0.000003 | 0.000004 |
| query end | 0.000005 | 0.000003 | 0.000003 |
| waiting for handler commit | 0.000012 | 0.000010 | 0.000002 |
| closing tables | 0.000011 | 0.000009 | 0.000002 |
| freeing items | 0.000034 | 0.000010 | 0.000024 |
| cleaning up | 0.000058 | 0.000022 | 0.000035 |
+--------------------------------+----------+----------+------------+
17 rows in set, 1 warning (0.01 sec)
(四)explain执行计划
EXPLAIN或者DESC命令获取mysql如何执行select语句的信息,包括在select执行过程中,表如何连接及连接的顺序。
语法:
直接在select 语句前面加上explain/desc
EXPLAIN SELECT 字段名 FROM 表名 WHERE 条件;
DESC SELECT 字段名 FROM 表名 WHERE 条件;
mysql> explain select * from user where id=2;
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| 1 | SIMPLE | user | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | NULL |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.01 sec)mysql> desc select * from user where id=2;
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| 1 | SIMPLE | user | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | NULL |
+----+-------------+-------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
执行计划中每个字段含义
id:select查询的序列号,表示查询中执行select子句或者操作表的顺序(id相同,执行顺序从上到下,id不同,值越大越先执行)
select_type:表示查询类型,常见的有SIMPLE(简单表,即不使用表连接或子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION中的第二个或者后面的语句)、SUBQUERY(select或者where之后包含了子查询)
type:表示连接类型,性能由好到差的连接类型是:NULL,system、const、eq_ref、ref、range、index、all
possible_keys:显示可能应用在这张表的上索引,一个或多个。
key:实际用到的索引,如果没用到展示位null
key_lens:表示索引中使用的字节数,该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好。
rows:mysql认为必须要执行查询的行数,在InnoDB引擎的表中,是一个估计值,可能并不总是准确的。
filtered:表示返回结果的行数占需读取行数的百分比,filtered的值越大越好。
mysql> select s.*,c.* from student_course sc,student s,course c where sc.student_id =s.id and sc.course_id = c.id;
+----+-----------+------------+----+--------+
| id | name | no | id | name |
+----+-----------+------------+----+--------+
| 1 | 红小豆 | 2000100101 | 1 | JAVA |
| 1 | 红小豆 | 2000100101 | 2 | PHP |
| 1 | 红小豆 | 2000100101 | 3 | MYSQL |
| 2 | 张天爱 | 2000100102 | 3 | MYSQL |
| 2 | 张天爱 | 2000100102 | 3 | MYSQL |
| 3 | 鹿晗 | 2000100103 | 4 | HADOOP |
+----+-----------+------------+----+--------+
6 rows in set (0.00 sec)mysql>
mysql>
mysql> desc select s.*,c.* from student_course sc,student s,course c where sc.student_id =s.id and sc.course_id = c.id;;
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------------------+------+----------+--------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------------------+------+----------+--------------------------------------------+
| 1 | SIMPLE | s | NULL | ALL | PRIMARY | NULL | NULL | NULL | 4 | 100.00 | NULL |
| 1 | SIMPLE | sc | NULL | ALL | NULL | NULL | NULL | NULL | 6 | 16.67 | Using where; Using join buffer (hash join) |
| 1 | SIMPLE | c | NULL | eq_ref | PRIMARY | PRIMARY | 4 | lyltest1.sc.course_id | 1 | 100.00 | NULL |
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------------------+------+----------+--------------------------------------------+
3 rows in set, 1 warning (0.00 sec)mysql> explain-> select s.* from student s where -> s.id in(select sc.student_id from student_course sc where sc.course_id=-> (select c.id from course c where c.name='MYSQL'));
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-----------------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-----------------------------------------------------------+
| 1 | PRIMARY | s | NULL | ALL | PRIMARY | NULL | NULL | NULL | 4 | 100.00 | NULL |
| 1 | PRIMARY | sc | NULL | ALL | NULL | NULL | NULL | NULL | 6 | 16.67 | Using where; FirstMatch(s); Using join buffer (hash join) |
| 3 | SUBQUERY | c | NULL | ALL | NULL | NULL | NULL | NULL | 4 | 25.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-----------------------------------------------------------+
3 rows in set, 1 warning (0.01 sec)
需要重点关注的字段
6、索引使用
使用原则
最左前缀法则
如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从最左列开始,并且不跳过索引中的列。
如果跳过某个列,索引将部分失效(后面的字段索引失效)
下图说明:跟查询条件的位置没关系,只要查询中包含了索引字段就行,包含了三个字段,则使用三个列的索引
索引失效的情况:
1)范围查询
联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效。使用>=,<=替代>,< ,使所有索引字段都生效。
explain select * from tb_user where profession=‘软件工程’ and age>30 and status='0';
--索引idx_user_pro_age_sta只能使用profession
explain select * from tb_user where profession=‘软件工程’ and age>=30 and status='0';
--索引idx_user_pro_age_sta 所有索引字段都生效
2)索引列运算
不要在索引列上进行运算操作,索引将失效。
3)字符串不加引号
4)模糊查询
如果仅仅是尾部进行模糊匹配,索引不会失效,如果是头部模糊匹配,索引失效。
应尽量避免模糊查询,开头加%的情况。
5)or连接的条件
用or分割开的条件,如果or前的条件中的列有索引,or后面的条件中的列没索引,那么涉及的索引都不会被引用到。
需要使or中的所有条件都有索引,查询才能走索引。
6)数据分布影响
如果mysql评估,使用索引比全表扫描更慢,则不使用索引。
数据的分布,可能会影响使用索引还是不使用。例如,某个字段如果大部分都是null ,则条件is null 就不走索引,is not null就会总索引
使用规则-SQL提示
sql提示是优化数据库的一个重要手段,简单来说就是,在sql语句中加入一些认为的提示,来达到优化操作的目的。
use index
explain select * from tb_user use index(idx_user_pro) where profession='软件工程';
ignore index
explain select * from tb_user use ignore index(idx_user_pro) where profession='软件工程';
force index
explain select * from tb_user use force index(idx_user_pro) where profession='软件工程';
使用规则-覆盖索引
尽量使用覆盖索引(查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到),减少select *。
知识小贴士:
using index condition:查询使用了索引,但是需要回表查询数据。
using where using index:查询使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据
前缀索引
1》使用场景:
当字段类型为字符串(varchar、text)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费很多磁盘IO,影响查询效率。此时可以只将字符串的一部分建立索引,这样可以大大节约索引空间,从而提高索引效率
2》语法:
create index idx_xxx on table_name(column(n)) --n表示字符串的前多少个字符
3》前缀长度:
可以根据索引的选择性来决定,而选择性是指,不重复的索引值(基数)和表中记录总数的比值,索引选择性越高,则查询效率越高。唯一索引的选择性是1,这是最好的索引选择性,效率也是最好的。
select count(distinct email)/count(*) from tb_user;
select count( distinct substring(email,1,5)) /count(*) from tb_user;
执行结果如下图:
4》查询流程
根据前5个字符,找到对应数据的id,根据id回表,找到对应行,再把表中数据跟条件对比;
循环找到下一个辅助索引中对应的id,回表……
如下图:
单列索引&联合索引选择
单列索引:一个索引只包含一个列。
联合索引:一个索引包含多个列。
在业务场景中,如果存在多个查询条件,考虑针对于查询字段建立索引时,建议建立联合索引而非单列索引。
单列索引情况:
explain select id,phone,name from tb_user where phone=‘12345678912’ and name=‘小美’
多条件联合查询时,mysql优化器会评估哪个索引的效率更高,会使用该索引完成本次查询。
联合索引情况:
如果查询覆盖索引,可以避免回表。
7、索引设计原则
三、sql优化
四、视图/存储过程/触发器
五、锁
六、InnoDB引擎
七、Mysql管理
相关文章:

Mysql学习笔记-进阶篇
一、存储引擎 1、MYSQL体系结构 连接层、服务层、引擎层、存储层; 2、存储引擎简介 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是库的,所以存储引擎也可被称为表类型。 1)在创…...

AI写真:ControlNet 之 InstantID
但是 IPAdapter-FaceId 目前只在 SD 1.5 模型上表现较好,SDXL 模型上的表现较差,不能用于实际生产。可是很多同学已经在使用SDXL了,而且SDXL确实整体上出图效果更好,怎么办? 这篇文章就来给大家介绍一个在SDXL中创作A…...

单元测试的思考与实践
1. 什么是单元测试 通常来说单元测试,是一种自动化测试,同时包含一下特性: 验证很小的一段代码(业务意义 或者 代码逻辑 上不可再分割的单元),能够更准确的定位到问题代码的位置 能够快速运行(…...

C# Socket通讯简单Demo
C# Socket通讯简单Demo Client端Listener端 Client端 static void Main(string[] args) {XSocketService XSocketService new XSocketService();XSocketService.Init();while (true){Console.Write("请输入消息:");var msg Console.ReadLine();XSocket…...

视频融合共享平台LntonCVS视频监控管理平台技术方案详细介绍
LntonCVS国标视频综合管理平台是一款以视频为核心的智慧物联应用平台。它基于分布式、负载均衡等流媒体技术进行开发,提供广泛兼容、安全可靠、开放共享的视频综合服务。该平台具备多种功能,包括视频直播、录像、回放、检索、云存储、告警上报、语音对讲…...

C#ListView的单元格支持添加基本及自定义任意控件
功能说明 使用ListView时,希望可以在单元格显示图片或其他控件,发现原生的ListView不支持,于是通过拓展,实现ListView可以显示任意控件的功能,效果如下: 实现方法 本来想着在单元格里面实现控件的自绘的…...

数据库选型实践:如何避开分库分表痛点 | OceanBase用户实践
随着企业业务的不断发展,数据量往往呈现出快速的增长趋势。使用MySQL的用户面对这种增长,普遍选择采用分库分表技术作为应对方案。然而,这一方案常在后期会遇到很多痛点。 分库分表的痛点 痛点 1:难以保证数据一致性。由于分库分…...

3个火火火的AI项目,开源了!
友友们,今天我要给你们安利三个超酷的开源项目,它们都和AI有关,而且每一个都能让你的日常生活变得更加有趣和便捷!(最近AI绘图又又超神了,分享以下美图养眼) 01 字节出品,文字转语音Seed-TTS 字节推出了一…...

算法 | 子集数排列树满m叉树二分搜索归并排序快速排序
子集树:O(2^n) 一个序列的所有子集为2^n,即可看成具有2^n个叶节点的满二叉树 int backtrack(int k) //k表示扩展结点在解空间树中所处的层次 {if(k>n) //n标识问题的规模output(x); //x是存放当前解的一维数组if(constraint(k)…...

SpringBoot配置第三方专业缓存技术jetcache方法缓存方案
jetcache方法缓存 我们可以给每个方法配置缓存方案 JetCache 是一个基于 Java 的缓存库,支持多种缓存方案和缓存策略,主要用于提升应用程序的性能和响应速度。它提供了多种缓存模式和特性,可以根据需求选择合适的缓存方案。 JetCache 的主…...

游戏开发丨基于PyGame的消消乐小游戏
文章目录 写在前面PyGame消消乐注意事项系列文章写在后面 写在前面 本期内容:基于pygame实现喜羊羊与灰太狼版消消乐小游戏 下载地址:https://download.csdn.net/download/m0_68111267/88700193 实验环境 python3.11及以上pycharmpygame 安装pygame…...

软件项目管理概述
1.什么是项目? 2.项目管理的定义 3.项目管理的本质 4.项目成功的标志 5.项目管理的基本方法 6.项目的生命周期(启动 计划 执行 控制 结束) 7.结合生活中的某件事,谈谈项目管理的作用 项目管理在日常生活中扮演着重要的角色&…...

FastAdmin后台开发框架 lang 任意文件读取漏洞复现
0x01 产品简介 FastAdmin是一款基于PHPBootstrap的开源后台框架,专为开发者精心打造。它基于ThinkPHP和Bootstrap两大主流技术构建,拥有完善的权限管理系统和一键生成CRUD等强大功能。FastAdmin致力于提高开发效率,降低开发成本,…...

数字时代PLM系统的重要性
什么是 PLM(产品生命周期管理)? 从最基本的层面上讲,产品生命周期管理 (PLM)是管理产品从最初构思、开发、服务和处置的整个过程的战略流程。换句话说,PLM 意味着管理产品从诞生到消亡所涉及的一切。 什么是 PLM 软件…...

安卓实现圆形按钮轮廓以及解决无法更改按钮颜色的问题
1.实现按钮轮廓 在drawable文件新建xml文件 <shape xmlns:android"http://schemas.android.com/apk/res/android"<!--实现圆形-->android:shape"oval"><!--指定内部的填充色--><solid android:color"#FFFFFF"/><!-…...

常用原语介绍
1.在Xilinx的example(wavegen example)中看到他们的顶层模块的输入输出管脚都手动例化原语IBUF以及OBUF——工具也会自动给我们加上不必要自己加 2.非mrcc个srcc的管脚输入的时钟信号,无法进入mmcm和bufg————试验过会报错 3.实际上&…...

29. 透镜阵列
导论: 物理传播光学(POP)不仅可以用于简单系统,也可以设计优化复杂的光学系统,比如透镜阵列。 设计流程: 透镜阵列建模 在孔径类型中选择“入瞳直径”,并输入2 在视场设定中。设置一个视场&…...

深入理解并打败C语言难关之一————指针(3)
前言: 昨天把指针最为基础的内容讲完了,并且详细说明了传值调用和传址调用的区别(这次我也是做到了每日一更,感觉有好多想写的但是没有写完),下面不多废话,下面进入本文想要说的内容 目录&#…...

Ubuntu-24.04-live-server-amd64启用ssh
系列文章目录 Ubuntu-24.04-live-server-amd64安装界面中文版 Ubuntu安装qemu-guest-agent Ubuntu乌班图安装VIM文本编辑器工具 文章目录 系列文章目录前言一、输入安装命令二、使用私钥登录(可选)1.创建私钥2.生成三个文件说明3.将公钥复制到服务器 三…...

Leetcode 2786. 访问数组中的位置使分数最大(DP 优化)
Leetcode 2786. 访问数组中的位置使分数最大 DP 以每个位置为结尾的序列的分数取决于前方的分数,根据奇偶性计算,取最大值 超时 class Solution {public long maxScore(int[] nums, int x) {int n nums.length;long dp[] new long[n];Arrays.fill(dp…...

【docker实战】使用Dockerfile的COPY拷贝资源遇到的问题
事情是这样的。 在我负责的golang项目中,使用硬代码验证某块逻辑。比如: 于是,为了解决硬代码的问题,我制作了表格工具:【开源项目】Excel数据表自动生成工具v1.0版 – 经云的清净小站 (skycreator.top)。 使用表格工…...

如何用多线程执行 unittest 测试用例实现方案
前言 使用python做过自动化测试的小伙伴,想必都知道unittest和pytest这两个单元测试框架,其中unittest是python的官方库,功能相对于pytest来要逊色不少,但是uniitest使用上手简单,也受到的很多的小伙伴喜爱。一直以来都…...

Ascend310 EP模式下容器内进行推理测试
EP模式下容器内进行推理测试 本文的软硬件环境如下: 机器:x86台式机一台 OS: 5.4.0-26-generic Ubuntu20.04 LTS 推理卡:DLAP200-HP-2(凌华基于atlas200模块打造的两模块推理卡) 1. 推理卡固件和驱动安…...

(el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
Ⅰ、Element-plus 提供的Select选择器组件与想要目标情况的对比: 1、Element-plus 提供Select组件情况: 其一、Element-ui 自提供的Select代码情况为(示例的代码): // Element-plus 提供的组件代码: <template><div class"f…...

Java基础之Math与Array类与System
文章目录 一、Math.random()二、Arrays.binarySearch()三、asList()四、System tip:以下是正文部分 一、Math.random() a < num < b int num (int)(Math.random() * (b - a 1)) a二、…...

警告:Hydration attribute mismatch on Note: this mismatch is check-only.(水合不匹配)
vue3Nuxt3运行代码是提示如下警告 [Vue warn]: Hydration attribute mismatch on <ul id"sub_menu_5_$$_sub1-popup" class"ant-menu ant-menu-sub ant-menu-inline" data-menu-list"true" style"display:none;">…...

【机器学习】CART决策树算法的核心思想及其大数据时代银行贷款参考案例——机器认知外界的重要算法
目录 引言 概述 CART决策树的特点 核心思想 减少不确定性的指标 基尼系数(Gini Index) 分类错误率 熵 银行实例 背景 数据准备 模型构建 模型评估与优化 应用与结果 代码示例 ✈✈✈✈引言✈✈✈✈ CART算法既可以用于分类问题࿰…...

编程软件是由什么编程的
编程软件是由什么编程的 在数字化的世界里,编程软件作为构建数字生态的基石,其背后所蕴含的奥秘往往令人感到困惑。那么,这些编程软件究竟是由什么编程的呢?这背后隐藏着怎样的逻辑与技术?接下来,我们将从…...

如何查看自己本地ip
1.winR 2.cmd 3.ipconfig...

高考分数限制下,选好专业还是选好学校?
高考分数限制下,选好专业还是选好学校? 高考作为每年一度的盛大考试,不仅关乎学生们的未来,更承载了家庭的期望。2004年高考刚刚结束,许多考生和家长已经开始为填报志愿而焦虑。选好学校和专业,直接关系到…...