MYSQL1

news2024/11/25 19:24:10

MySQL基本1

  • 1、MySQL 中有哪几种锁?
  • 2、MySQL 中有哪些不同的表格?
  • 2、什么是存储引擎
  • 3、MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别
  • 4、CHAR 和 VARCHAR 的区别
    • 1、固定长度 & 可变长度
    • 2、存储方式
    • 3、存储容量
    • 4、CHAR会默认切掉字符串末尾的空格
  • 5、mysql主键和候选键有什么区别
  • 6、LIKE 声明中的%和_
  • 7、BLOB 和 TEXT 有什么区别
  • 8、非标准字符串类型
  • 9、是通用 SQL 函数
  • 10、MySQL 有关权限的表都有哪几个
  • 11、SQL 注入漏洞产生的原因?如何防止
  • 12、索引
  • 13、SQL 语言包括哪几部分?每部分都有哪些操作关键字
  • 14、完整性约束包括哪些
  • 15、什么叫视图?游标是什么?
  • 16、三个范式
  • 17、主键、外键和索引的区别
  • 18、SQL 语句优化有哪些方法
  • 19、MySQL优化-读写分离
  • 20、EXPLAIN
    • 1、explain 有两个变种:
    • 2、explain 中的列:
  • 21、索引最佳实践

1、MySQL 中有哪几种锁?

1、表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

2、行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

3、页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

2、MySQL 中有哪些不同的表格?

MySQL实际上支持五种不同的表类型.这五种类型分别是BDB、HEAP、ISAM、MERGE以及MyISAM。其中BDB类型单独属于一类,称为“事务安全型”(transaction-safe),其余的表类型属于第二类,称为“非事务安全型”(non-transaction-safe)。

1、MyISAM:

这是目前中MySQL默认使用的数据表类型。其优点是 如果主机操作系统支持大尺寸文件,数据表长度就能够很大,就能客纳更多的数据;

数据表内容独立于硬件也就是说可以把数据表在机器之间随意拷贝;

提高了索引方面的功能;

提供了更好的索引键压缩效果;

auto_incremnet能力加强;

改进了对数据表的完整性检查机制;

支持进行fulltext全文本搜索;

数据表在硬盘上的文件存储方式:MyISAM Frm myd myi;

2、Heap
这是一种使用内存的数据表,而且各个数据行的长度固定,这两个特性使得这种类型数据表的检索速度非常快,作为一种临时性的数据表,HEAP在某些特定情况下很有用。

数据表在硬盘上的文件存储方式:Heap Frm;

3、Merge

这是一种把相同结构的MyIASM数据表组织为一个逻辑单元的方法;

数据表在硬盘上的文件存储方式:Merge Frm mrg;

4、INNODB:

这是最近加入MySQL的数据表类型,有许多新的特性;

支持事务处理机制;

崩溃后能够立刻恢复;

支持外键功能,包括级联删除;

具有并发功能;

数据表在硬盘上的文件存储方式:InnoDB frm;

5、ISAM
mysql3.23版本之前的MySQL支特的唯一一种表类型,目前己经过时,MyIASM处理程库逐步取代了ISAM处理程序,这种老式的表 类型己经没有人在用了数据表在硬盘上的文件存储方式:IASM Frm isd ism;

6、BDB数据表

这种数据表支持事务处理机制,具有良好的并发性能;

数据表在硬盘上的文件存储方式:BDB Frm db;

2、什么是存储引擎

同Oracle 和SQL Server等大型数据库系统一样,MySql也是客户/服务器系统并且是单进程多线程架构的数据库。

MySql区别于其它数据库系统的一个重要特点是支持插入式存储引擎。

存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。

在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。

MySql中有哪些存储引擎? MyISAM:这种引擎是mysql最早提供的。不管是何种MyISAM表,目前它都不支持事务,行级锁和外键约束的功能。这种引擎又可以分为静态MyISAM、动态MyISAM 和压缩MyISAM三种:静态MyISAM:如果数据表中的各数据列的长度都是预先固定好的,服务器将自动选择这种表类型。因为数据表中每一条记录所占用的空间都是一样的,所以这种表存取和更新的效率非常高。当数据受损时,恢复工作也比较容易做。

动态MyISAM:如果数据表中出现varchar、xxxtext或xxxBLOB字段时,服务器将自动选择这种表类型。相对于静态MyISAM,这种表存储空间比较小,但由于每条记录的长度不一,所以多次修改数据后,数据表中的数据就可能离散的存储在内存中,进而导致执行效率下降。同时,内存中也可能会出现很多碎片。因此,这种类型的表要经常用optimize table 命令或优化工具来进行碎片整理。

压缩MyISAM:以上说到的两种类型的表都可以用myisamchk工具压缩。这种类型的表进一步减小了占用的存储,但是这种表压缩之后不能再被修改。另外,因为是压缩数据,所以这种表在读取的时候要先时行解压缩。

MyISAM Merge引擎:这种类型是MyISAM类型的一种变种。合并表是将几个相同的MyISAM表合并为一个虚表。常应用于日志和数据仓库。

InnoDB:InnoDB表类型可以看作是对MyISAM的进一步更新产品,它提供了事务、行级锁机制和外键约束的功能。

memory(heap):这种类型的数据表只存在于内存中。它使用散列索引,所以数据的存取速度非常快。因为是存在于内存中,所以这种类型常应用于临时表中。

archive:这种类型只支持select 和 insert语句,而且不支持索引。常应用于日志记录和聚合分析方面。

3、MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别

SQL标准定义的四个隔离级别为:

1、未提交读(READ UNCOMMITTED)

在隔离级别中,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为他的性能也不比其他级别好多少。读取到未提交的数据,也被称之为脏读(Dirty Read).

2、提交读(READ COMMITTED)

这是大多数 数据库系统的默认隔离级别(但不是Mysql 默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读 ( Nonrepeatable Read ), 因为同一事物的其他实例在该实例处理期间可能会有新的Commit ,所以同一 select 可以返回不同结果。

3、可重复读(REPEATABLE READ)

这是Mysql 的默认事务隔离级别,它确保同一事物的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题 :
幻读 ( Phantom Read):简单的说,幻读指当用户读取某一范围的数据行时, 另一事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影”行 。 InnoDB 和 Falcon 存储引擎通过多版本并发控制(MVCC 、Multiversion Concurrency Control 间隙锁)机制解决问题。注:其实多版本只是解决不可重复读问题,而加上间隙锁(也就时它这里所谓的并发控制)才解决了幻读问题。

4、序列化(SERIALIZABLE)

这是最高的隔离级别,它通过强制事务排序,使之不可能互相冲突从而解决幻读问题。简而言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
在这里插入图片描述

4、CHAR 和 VARCHAR 的区别

1、固定长度 & 可变长度

1、VARCHAR类型用于存储可变长度字符串,是最常见的字符串数据类型。它比固定长度类型更节省空间,因为它仅使用必要的空间(根据实际字符串的长度改变存储空间)。有一种情况例外,如果MySQL表使用ROW_FORMAT=FIXED创建的话,每一行都会使用定长存储。
2、CHAR类型用于存储固定长度字符串:MySQL总是根据定义的字符串长度分配足够的空间。当存储CHAR值时,MySQL会删除字符串中的末尾空格(在MySQL 4.1和更老版本中VARCHAR 也是这样实现的——也就是说这些版本中CHAR和VARCHAR在逻辑上是一样的,区别只是在存储格式上)。
  同时,CHAR值会根据需要采用空格进行剩余空间填充,以方便比较和检索。但正因为其长度固定,所以会占据多余的空间,也是一种空间换时间的策略;

2、存储方式

1、VARCHAR需要使用1或2个额外字节记录字符串的长度:如果列的最大长度小于或等于255字节,则只使用1个字节表示,否则使用2个字节。假设采用latinl字符集,一个VARCHAR(10)的列需要11个字节的存储空间。VARCHAR(1000)的列则需要1002 个字节,因为需要2个字节存储长度信息。

VARCHAR节省了存储空间,所以对性能也有帮助。但是,由于行是变长的,在UPDATE时可能使行变得比原来更长,这就导致需要做额外的工作。如果一个行占用的空间增长,并且在页内没有更多的空间可以存储,在这种情况下,不同的存储引擎的处理方式是不一样的。例如,MylSAM会将行拆成不同的片段存储,InnoDB则需要分裂页来使行可以放进页内。

2、CHAR适合存储很短或长度近似的字符串。例如,CHAR非常适合存储密码的MD5值,因为这是一个定长的值。对于经常变更的数据,CHAR也比VARCHAR更好,因为定长的CHAR类型不容易产生碎片。对于非常短的列,CHAR比VARCHAR在存储空间上也更有效率。例如用CHAR(1)来存储只有Y和N的值,如果采用单字节字符集只需要一个字节,但是VARCHAR(1)却需要两个字节,因为还有一个记录长度的额外字节。

3、存储容量

1、对于char类型来说,最多只能存放的字符个数为255,和编码无关,任何编码最大容量都是255。

2、MySQL行默认最大65535字节,是所有列共享(相加)的,所以VARCHAR的最大值受此限制。

表中只有单列字段情况下,varchar一般最多能存放(65535 - 3)个字节,varchar的最大有效长度通过最大行数据长度和使用的字符集来确定,通常的最大长度是65532个字符(当字符串中的字符都只占1个字节时,能达到65532个字符);

GBK编码: 一个英文字符占一个字节,中文2字节,单字符最大可占用2个字节。

UTF-8编码: 一个英文字符占一个字节,中文3字节,单字符最大可占用3个字节。

utf8mb4编码: 一个英文字符占一个字节,中文3字节,单字符最大占4个字节(如emoji表情4字节)。

4、CHAR会默认切掉字符串末尾的空格

5、mysql主键和候选键有什么区别

1、候选键可为NULL也可不唯一,用于唯一标识表或关系中的每条记录。不止一个候选键可用于唯一地标识表或关系。例如一个student表,我们可以选择他的编号{id}或者是出生日期{birthday}作为这个student表的主键,都具备对student表进行唯一标识的作用,所以可以为多个也可以为NULL;

2、主键是唯一且非空的,用于唯一标识表或关系中的每条记录。例如一个student表,我们选择他的编号{id}作为主键,因为每个人的姓名可能相同,但是我们命名的编号肯定不同,所以就起到了唯一标识的作用。并且主键唯一且非空,{id}做到了。

主键也是候选键。按照惯例,候选键可以被指定为主键,并且可以用于任何外键引用。

6、LIKE 声明中的%和_

1、%百分号通配符:表示任何字符出现任意次数(可以是0次);
2、_下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符;

7、BLOB 和 TEXT 有什么区别

BLOB 是一个二进制对象,可以容纳可变数量的数据。TEXT 是一个不区分大小写的 BLOB。
BLOB 和 TEXT 类型之间的唯一区别在于对 BLOB 值进行排序和比较时区分大小写,对 TEXT 值不区分大小写。

8、非标准字符串类型

1、TINYTEXT
2、TEXT
3、MEDIUMTEXT
4、LONGTEXT

9、是通用 SQL 函数

1、CONCAT(A, B) – 连接两个字符串值以创建单个字符串输出。通常用于将两个
或多个字段合并为一个字段。
2、FORMAT(X, D)- 格式化数字 X 到 D 有效数字。
3、CURRDATE(), CURRTIME()- 返回当前日期或时间。
4、NOW() – 将当前日期和时间作为一个值返回。
5、MONTH(),DAY(),YEAR(),WEEK(),WEEKDAY() – 从日期
值中提取给定数据。
6、HOUR(),MINUTE(),SECOND() – 从时间值中提取给定数据。
7、DATEDIFF(A,B) – 确定两个日期之间的差异,通常用于计算年龄
8、SUBTIMES(A,B) – 确定两次之间的差异。
9、FROMDAYS(INT) – 将整数天数转换为日期值。

10、MySQL 有关权限的表都有哪几个

MySQL 服务器通过权限表来控制用户对数据库的访问,权限表存放在 MySQL 数据库里,由 MySQL_install_db 脚本初始化。这些权限表分别 user,db,table_priv,columns_priv 和 host。

11、SQL 注入漏洞产生的原因?如何防止

程序开发过程中不注意规范书写sql 语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST 和GET 提交一些sql 语句正常执行。

防止SQL 注入的方式:

1、开启配置文件中的magic_quotes_gpc 和magic_quotes_runtime 设置;

2、执行sql 语句时使用addslashes 进行sql 语句转换;

3、Sql 语句书写尽量不要省略双引号和单引号;

4、过滤掉sql 语句中的一些关键词: update、insert、delete、select、* 。

5、提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。

12、索引

1、索引的目的是什么

1、快速访问数据表中的特定信息,提高检索速度;
2、创建唯一性索引,保证数据库表中每一行数据的唯一性。
3、加速表和表之间的连接;
4、使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间;

2、索引对数据库系统的负面影响

创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。

3、数据表建立索引的原则
在最频繁使用的、用以缩小查询范围的字段上建立索引。
在频繁使用的、需要排序的字段上建立索引。

4、什么情况下不宜建立索引
对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。
对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等。

13、SQL 语言包括哪几部分?每部分都有哪些操作关键字

SQL 语言包括数据定义(DDL)、数据操纵(DML),数据控制(DCL)和数据查询(DQL)四个部分。

数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index 等;

数据操纵:Select ,insert,update,delete,;

数据控制:grant,revoke;

数据查询:select;

14、完整性约束包括哪些

数据完整性(Data Integrity)是指数据的精确(Accuracy)和可靠性(Reliability)。

分为以下四类:
1、实体完整性:规定表的每一行在表中是惟一的实体。
2、域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括
取值范围、精度等规定。
3、参照完整性:是指两个表的主关键字和外关键字的数据应一致,保证了表之间
的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。
4、用户定义的完整性:不同的关系数据库系统根据其应用环境的不同,往往还需
要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束
条件,它反映某一具体应用必须满足的语义要求。

与表有关的约束:包括列约束(NOT NULL(非空约束))和表约束(PRIMARY KEY、foreign key、check、UNIQUE) 。

15、什么叫视图?游标是什么?

视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

16、三个范式

第一范式:1NF 是对属性的原子性约束,要求属性具有原子性,不可再分解;
第二范式:2NF 是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
第三范式:3NF 是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。

范式化设计优缺点:

优点:
可以尽量得减少数据冗余,使得更新快,体积小;

缺点:
对于查询需要多个表进行关联,减少写得效率增加读得效率,更难进行索引优化;

反范式化:
优点:可以减少表得关联,可以更好得进行索引优化;
缺点:数据冗余以及数据异常,数据得修改需要更多的成本;

17、主键、外键和索引的区别

定义:

主键–唯一标识一条记录,不能有重复的,不允许为空;

外键–表的外键是另一表的主键, 外键可以有重复的, 可以是空值;

索引–该字段没有重复值,但可以有一个空值;

作用:
主键–用来保证数据完整性;
外键–用来和其他表建立联系用的;
索引–是提高查询排序的速度;

个数:
主键–主键只能有一个;
外键–一个表可以有多个外键;
索引–一个表可以有多个唯一索引;

18、SQL 语句优化有哪些方法

1、Where 子句中:where 表之间的连接必须写在其他 Where 条件之前,那些可以过滤掉最大数量记录的条件必须写在 Where 子句的末尾.HAVING 最后。

2、用 EXISTS 替代 IN、用 NOT EXISTS 替代 NOT IN。

3、 避免在索引列上使用计算;

4、避免在索引列上使用 IS NULL 和 IS NOT NULL;

5、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

6、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描;

7、应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描;

19、MySQL优化-读写分离

查看文档:https://blog.csdn.net/weixin_47268011/article/details/119178265

20、EXPLAIN

使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是 如何处理SQL语句的。分析查询语句或是结构的性能瓶颈;在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询时,会返回执行计划的信息,而不是执行这条SQL(如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中)。

1、explain 有两个变种:

1)explain extended:会在 explain 的基础上额外提供一些查询优化的信息。紧随其后通过show warnings 命令可以 得到优化后的查询语句,从而看出优化器优化了什么。额外还有filtered 列,是一个半分比的值,rows * filtered/100 可以估算出将要和 explain 中前一个表进行连接的行数(前一个表指 explain 中的id值比当前表id值小的表)。

2)explain partitions:相比 explain 多了个 partitions 字段,如果查询是基于分区表的话,会显示查询将访问的分区。

2、explain 中的列:

  1. id列
    id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。
    MySQL将 select 查询分为简单查询(SIMPLE)和复杂查询(PRIMARY)。
    复杂查询分为三类:简单子查询、派生表(from语句中的子查询)、union 查询。
    id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行。

  2. select_type列
    select_type 表示对应行是简单还是复杂的查询,如果是复杂的查询,又是上述三种复杂查询中的哪一种。
    1)simple:简单查询。查询不包含子查询和union;
    2)primary:复杂查询中最外层的 select;
    3)subquery:包含在 select 中的子查询(不在 from 子句中);
    4)derived:包含在 from 子句中的子查询。MySQL会将结果存放在一个临时表中,也称为派生表(derived的英文含义);
    5)union:在 union 中的第二个和随后的 select;
    6)union result:从 union 临时表检索结果的 select;

  3. table列
    这一列表示 explain 的一行正在访问哪个表。
    当 from 子句中有子查询时,table列是 格式,表示当前查询依赖 id=N 的查询,于是先执行 id=N 的查询。
    当有 union 时,UNION RESULT 的 table 列的值为<union1,2>,1和2表示参与 union 的select 行id。

  4. type列
    这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围。
    依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL;
    一般来说,得保证查询达到range级别,最好达到ref;

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

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

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

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

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

index:扫描全表索引,这通常比ALL快一些。(index是从索引中读取的,而all是从硬盘中读取);

ALL:即全表扫描,意味着mysql需要从头到尾去查找所需要的行。通常情况下这需要增加索引来进行优化了;

  1. possible_keys列
    这一列显示查询可能使用哪些索引来查找。
    explain 时可能出现 possible_keys 有列,而 key 显示 NULL 的情况,这种情况是因为表中数据不多,mysql认为索引对此查询帮助不大,选择了全表查询。
    如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查 where 子句看是否可以创造一个适当的索引来提高查询性能,然后用 explain 查看效果。

  2. key列
    这一列显示mysql实际采用哪个索引来优化对该表的访问。如果没有使用索引,则该列是 NULL。如果想强制mysql使用或忽视possible_keys列中的索引,在查询中使用 force index、ignore index。

  3. key_len列
    这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列。

  4. ref列
    这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),字段名(例:film.id)

  5. rows列
    这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的行数。

  6. Extra列
    这一列展示的是额外信息。常见的重要值如下:
    1)Using index:查询的列被索引覆盖,并且where筛选条件是索引的前导列,是性能高的表现。一般是使用了覆盖索引(索引包含了所有查询的字段)。对于innodb来说,如果是辅助索引性能会有不少提高。
    2)Using where:查询的列未被索引覆盖,where筛选条件非索引的前导列;
    3)Using where Using index:查询的列被索引覆盖,并且where筛选条件是索引列之一但是不是索引的前导列,意味着无法直接通过索引查找来查询到符合条件的数据;
    4)NULL:查询的列未被索引覆盖,并且where筛选条件是索引的前导列,意味着用到了索引,但是部分字段未被索引覆盖,必须通过“回表”来实现,不是纯粹地用到了索引,也不是完全没用到索引;
    5)Using index condition:与Using where类似,查询的列不完全被索引覆盖,where条件中是一个前导列的范围;
    6)Using temporary:mysql需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化。
    7)Using filesort:mysql 会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。此
    时mysql会根据联接类型浏览所有符合条件的记录,并保存排序关键字和行指针,然后排序关键字并按顺序检索行信息。这种情况下一般也是要考虑使用索引来优化的。

21、索引最佳实践

– 1.联合索引全值匹配
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.最佳左前缀法则:查询从联合索引的最左前列开始并且不跳过索引中的列
EXPLAIN SELECT * FROM employees WHERE age = 22 AND position =‘manager’;
EXPLAIN SELECT * FROM employees WHERE position = ‘manager’;
EXPLAIN SELECT * FROM employees WHERE name = ‘LiLei’;

– 3.不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转
向全表扫描
EXPLAIN SELECT * FROM employees WHERE name = ‘LiLei’;
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’;

– 5.尽量使用覆盖索引(只访问索引的查询(索引列包含查询列)),减少select *语句
EXPLAIN SELECT name,age,position FROM employees;
EXPLAIN SELECT * FROM employees;

– 6.mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描
EXPLAIN SELECT * FROM employees WHERE name != ‘LiLei’;

– 7.is null,is not null 也无法使用索引
EXPLAIN SELECT * FROM employees WHERE name is null;

– 8.like以通配符开头(‘$abc…’)mysql索引失效会变成全表扫描操作
EXPLAIN SELECT * FROM employees WHERE name like ‘%Lei’;
EXPLAIN SELECT * FROM employees WHERE name like ‘Lei%’;

– 用覆盖索引优化like’%字符串%’
EXPLAIN SELECT name,age,position FROM employees WHERE name like ‘%Lei%’;

– 9.字符串不加单引号索引失效
EXPLAIN SELECT * FROM employees WHERE name = ‘1000’;
EXPLAIN SELECT * FROM employees WHERE name = 1000;

– 10.少用or或in,用它查询时,非主键字段的索引会失效,主键索引有时生效,有时不生
效,跟数据量有关,具体还得看mysql的查询优化结果
EXPLAIN SELECT * FROM employees WHERE name = ‘LiLei’ or name = ‘HanMeimei’;

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

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

相关文章

cookie session Token终极理解

左边 浏览器 右边 服务器 浏览器发送请求 服务器接收请求 并生成cookie 浏览器查看保存了哪些cookie 用户名密码放在cookie是很不安全的 因为浏览器一旦被攻击泄露 是很危险的 接着诞生了session 会话 sessionID &#xff08;一段杂乱的字母标识&#xff09; 会话结束时间 …

【云原生】Istio请求路由、流量转发、超时配置等

代码继续接着前面的文章【云原生】整合K8s SpringCloudK8s gRpc RocketMQ Istio Envoy&#xff0c;本篇文章我们测试下请求路由功能。生产中我们上了个新接口或者新功能&#xff0c;一般会经过 内灰 -> 外灰5% -> 外灰10% ...... 外灰100%的过程&#xff0c;这篇文章…

计算机图形学08:中点BH算法绘制抛物线(100x = y^2)

作者&#xff1a;非妃是公主 专栏&#xff1a;《计算机图形学》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、算法原理二、…

springboot整合mybatis框架,简单实现CRUD

如果大家实在不知道怎么搞可以去看看官网:mybatis-plus官网MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。其实也就是在…

5. 驱动开发

文章目录一、驱动开发1.1 前言1.2 何谓驱动框架1.3 内核驱动框架中LED的基本情况1.3.1 相关文件1.3.2 九鼎移植的内核中led驱动1.3.3 案例分析驱动框架的使用1.3.4 典型的驱动开发行业现状1.4 初步分析led驱动框架源码1.4.1 涉及到的文件1.4.2 subsys_initcall1.4.3 led_class_…

windows应用(vc++2022)MFC基础到实战(1)

目录vc概述MFC 框架概述MFC 框架SDI 和 MDI文档、视图和框架窗口对象文档/视图体系结构第一个应用自动生成的主框架类源码vc概述 Microsoft Visual C&#xff08;简称Visual C、MSVC、VS或VC&#xff09;是微软公司的免费C开发工具&#xff0c;具有集成开发环境&#xff0c;可…

Spring Security OAuth2实现多用户类型认证、刷新Token

原本的OAuth2登录支持用户名密码登录&#xff0c;现在还想支持另外用id号码和密码登录。但是OAuth2默认提供的UserDetailsService只允许传入一个参数&#xff1a;想要实现多种用户登录&#xff0c;是不是可以考虑loadUserByUsername方法携带多个参数呢&#xff1f;接下来记录一…

Docker安装和Docker安装Nginx及其他常用操作

一、Docker简介 Docker 是一个开源的应用容器引擎&#xff0c;基于Go 语言并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。 容器是完全…

机器学习与目标检测作业:连通块算法

机器学习与目标检测作业&#xff1a;连通块算法一、连通块算法题目描述二、连通块算法文件结构三、连通块算法程序编写3.1、连通块算法conBlock.h头文件内容3.2、conBlock.cpp源文件内容3.3.3、mian.h头文件内容3.3.4、main.cpp源文件内容如下四、连通块算法程序运行结果一、连…

【JS知识点】——原型和原型链

文章目录原型和原型链构造函数原型显式原型&#xff08;prototype&#xff09;隐式原型&#xff08;\_\_proto\_\_&#xff09;原型链总结原型和原型链 在js中&#xff0c;原型和原型链是一个非常重要的知识点&#xff0c;只有理解原型和原型链&#xff0c;才能深刻理解JS。在…

云上办公系统项目

云上办公系统项目1、云上办公系统1.1、介绍1.2、核心技术1.3、开发环境说明1.4、产品展示后台前台1.5、 个人总结2、后端环境搭建2.1、建库建表2.2、创建Maven项目pom文件guigu-oa-parentcommoncommon-utilservice-utilmodelservice-oa配置数据源、服务器端口号application.yml…

D2-Net: A Trainable CNN for Joint Description and Detection of Local Features精读

开源代码&#xff1a;D2-Net 1 摘要 在这项工作中&#xff0c;我们解决了在困难的成像条件下寻找可靠的像素级对应的问题。我们提出了一种由单一卷积神经网络发挥双重作用的方法&#xff1a;它同时是一个密集的特征描述符和一个特征检测器。通过将检测推迟到后期阶段&#xf…

统计代码量

一 windows 在 Windows 系统上&#xff0c;您可以使用 PowerShell 命令行工具来统计项目的代码量。下面是使用 PowerShell 统计项目代码量的步骤&#xff1a; 打开 PowerShell 终端&#xff1a;按下 Win X 键&#xff0c;选择「Windows PowerShell&#xff08;管理员&#xf…

SQL分库分表

什么是分库分表&#xff1f; 分库分表是两种操作&#xff0c;一种是分库&#xff0c;一种是分表。 分库分表又分为垂直拆分和水平拆分两种。 &#xff08;1&#xff09;分库&#xff1a;将原来存放在单个数据库中的数据&#xff0c;拆分到多个数据库中存放。 &#xff08;2&…

【三.项目引入axios、申明全局变量、设置跨域】

根据前文《二.项目使用vue-router,引入ant-design-vue的UI框架&#xff0c;引入less》搭建好脚手架后使用 需求&#xff1a; 1.项目引入axios 2.申明全局变量 3.设置跨域 简介&#xff1a;axios本质上还是对原生XMLHttpRequest的封装&#xff0c;可用于浏览器和nodejs的HTTP客…

物理层概述(二)重点

目录前言编码与调制&#xff08;1&#xff09;基带信号与宽带信号编码与调制编码与调制&#xff08;2&#xff09;数字数据编码为数字信号非归零编码【NRZ】曼斯特编码差分曼彻斯特编码数字数据调制为模拟信号模拟数据如何编码为数字信号模拟数据调制为模拟信号物理层传输介质导…

Go语言学习的第一天(对于Go学习的认识和工具选择及环境搭建)

首先学习一门新的语言&#xff0c;我们要知道这门语言可以帮助我们做些什么&#xff1f;为什么我们要学习这门语言&#xff1f;就小wei而言学习这门语言是为了区块链&#xff0c;因为自身是php出身&#xff0c;因为php的一些特性只能通过一些算法模拟的做一个虚拟链&#xff0c…

IT服务管理(ITSM) 中的大数据

当我们谈论IT服务管理&#xff08;ITSM&#xff09;领域的大数据时&#xff0c;我们谈论的是关于两件不同的事情&#xff1a; IT 为业务提供的大数据工具/服务 - 对业务运营数据进行数字处理。IT 运营中的大数据 – 处理和利用复杂的 IT 运营数据。 面向业务运营的大数据服务…

Hadoop节点的分类与作用

文件的数据类型文件有一个stat命令元数据信息-->描述文件的属性文件有一个vim命令查看文件的数据信息分类元数据File 文件名 Size 文件大小&#xff08;字节&#xff09; Blocks 文件使用的数据块总数 IO Block 数据块的大小 regular file&#xff1a;文件类型&#xff…

YOLOV5中添加CBAM模块详解——原理+代码

目录一、前言二、CAM1. CAM计算过程2. 代码实现3. 流程图三、SAM1. SAM计算过程2. 代码实现3. 流程图四、YOLOv5中添加CBAM模块参考文章一、前言 由于卷积操作通过融合通道和空间信息来提取特征&#xff08;通过NNNNNN的卷积核与原特征图相乘&#xff0c;融合空间信息&#xff…