当前位置: 首页 > news >正文

烟台网站排行榜/图片外链生成工具在线

烟台网站排行榜,图片外链生成工具在线,视频网站搭建源码,借钱软件推广微信hyhyk1一、存储引擎 1、MYSQL体系结构 连接层、服务层、引擎层、存储层; 2、存储引擎简介 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是库的,所以存储引擎也可被称为表类型。 1)在创…

一、存储引擎

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

索引支持情况

索引InnoDBMyISAMMemory
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体系结构 连接层、服务层、引擎层、存储层&#xff1b; 2、存储引擎简介 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的&#xff0c;而不是库的&#xff0c;所以存储引擎也可被称为表类型。 1&#xff09;在创…...

AI写真:ControlNet 之 InstantID

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

单元测试的思考与实践

1. 什么是单元测试 通常来说单元测试&#xff0c;是一种自动化测试&#xff0c;同时包含一下特性&#xff1a; 验证很小的一段代码&#xff08;业务意义 或者 代码逻辑 上不可再分割的单元&#xff09;&#xff0c;能够更准确的定位到问题代码的位置 能够快速运行&#xff08;…...

C# Socket通讯简单Demo

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

视频融合共享平台LntonCVS视频监控管理平台技术方案详细介绍

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

C#ListView的单元格支持添加基本及自定义任意控件

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

数据库选型实践:如何避开分库分表痛点 | OceanBase用户实践

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

3个火火火的AI项目,开源了!

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

算法 | 子集数排列树满m叉树二分搜索归并排序快速排序

子集树&#xff1a;O(2^n) 一个序列的所有子集为2^n&#xff0c;即可看成具有2^n个叶节点的满二叉树 int backtrack(int k) //k表示扩展结点在解空间树中所处的层次 {if(k>n) //n标识问题的规模output(x); //x是存放当前解的一维数组if(constraint(k)…...

SpringBoot配置第三方专业缓存技术jetcache方法缓存方案

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

游戏开发丨基于PyGame的消消乐小游戏

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

软件项目管理概述

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

FastAdmin后台开发框架 lang 任意文件读取漏洞复现

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

数字时代PLM系统的重要性

什么是 PLM&#xff08;产品生命周期管理&#xff09;&#xff1f; 从最基本的层面上讲&#xff0c;产品生命周期管理 (PLM)是管理产品从最初构思、开发、服务和处置的整个过程的战略流程。换句话说&#xff0c;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&#xff08;wavegen example&#xff09;中看到他们的顶层模块的输入输出管脚都手动例化原语IBUF以及OBUF——工具也会自动给我们加上不必要自己加 2.非mrcc个srcc的管脚输入的时钟信号&#xff0c;无法进入mmcm和bufg————试验过会报错 3.实际上&…...

29. 透镜阵列

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

深入理解并打败C语言难关之一————指针(3)

前言&#xff1a; 昨天把指针最为基础的内容讲完了&#xff0c;并且详细说明了传值调用和传址调用的区别&#xff08;这次我也是做到了每日一更&#xff0c;感觉有好多想写的但是没有写完&#xff09;&#xff0c;下面不多废话&#xff0c;下面进入本文想要说的内容 目录&#…...

Ubuntu-24.04-live-server-amd64启用ssh

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

Leetcode 2786. 访问数组中的位置使分数最大(DP 优化)

Leetcode 2786. 访问数组中的位置使分数最大 DP 以每个位置为结尾的序列的分数取决于前方的分数&#xff0c;根据奇偶性计算&#xff0c;取最大值 超时 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项目中&#xff0c;使用硬代码验证某块逻辑。比如&#xff1a; 于是&#xff0c;为了解决硬代码的问题&#xff0c;我制作了表格工具&#xff1a;【开源项目】Excel数据表自动生成工具v1.0版 – 经云的清净小站 (skycreator.top)。 使用表格工…...

如何用多线程执行 unittest 测试用例实现方案

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

Ascend310 EP模式下容器内进行推理测试

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

(el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程

Ⅰ、Element-plus 提供的Select选择器组件与想要目标情况的对比&#xff1a; 1、Element-plus 提供Select组件情况&#xff1a; 其一、Element-ui 自提供的Select代码情况为(示例的代码)&#xff1a; // Element-plus 提供的组件代码: <template><div class"f…...

Java基础之Math与Array类与System

文章目录 一、Math.random&#xff08;&#xff09;二、Arrays.binarySearch()三、asList&#xff08;&#xff09;四、System tip&#xff1a;以下是正文部分 一、Math.random&#xff08;&#xff09; 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决策树的特点 核心思想 减少不确定性的指标 基尼系数&#xff08;Gini Index&#xff09; 分类错误率 熵 银行实例 背景 数据准备 模型构建 模型评估与优化 应用与结果 代码示例 ✈✈✈✈引言✈✈✈✈ CART算法既可以用于分类问题&#xff0…...

编程软件是由什么编程的

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

如何查看自己本地ip

1.winR 2.cmd 3.ipconfig...

高考分数限制下,选好专业还是选好学校?

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