首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

小胖问我:MySQL 索引原理是怎样?(建议收藏)

1.1 索引优缺点 优点 提高查询语句执行效率,减少 IO 操作次数 创建唯一性索引,可以保证数据库表中每一行数据唯一性 加了索引会进行排序(一本书章节顺序不就是按照目录来排嘛),在使用分组和排序子句进行查询...单列索引 没啥好说,就是索引数量只有一个,每个表可以有多个单列索引。 组合索引 多值组成一个索引,专门用于组合搜索,其效率大于索引合并。注意,使用它时候需要遵守最左匹配原则。...在组合索引树中,最底层叶子节点按照第一 name 从左到右递增排列,但是 age 是无序,age 只有在 name 值相等情况下小范围内递增有序。...查询数据,由于辅助索引键值不唯一,可能存在多个拥有相同记录,所以即使是等值查询,也需要按照范围查询方式在辅助索引树中检索数据。...使用覆盖索引,举个栗子:还是上面的 student ,一条 sql 在业务上很常用: select id, name, age from student where name = '二狗2'; 而

65020

行列互换问题,怎么办?送你一个万能模版

1.输出行列互换表结构 可以看出,需要输出有5,其中只有“年”这一是表cook中原有的,其他4(也就是2-5:m1对应是1月份、m2对应是2月份、m3对应是3月份、m4对应是4月份)...select 年,m1,m2,m3,m4from cook; 可以看出查询结果和目标表列名结构一样,但是2-5(m1、m2、m3、m4)值不是题目要求: 2....select A,-- 第2步,在行列互换结果表中,其他值分别使用case和max来获取max(case B when 'm' then C else 0 end) as 'm',max(case... B when 'n' then C else 0 end) as 'n'from cook-- 第1步,在行列互换结果表中按第1分组group by A; 【举一反三】 下面是学生成绩表(表名:成绩表...,列名:学号,课程,成绩) 使用sql语句实现将该表行转化为下面的表结构: 参考答案: select 学号,-- 第2步,在行列互换结果表中,其他值分别使用case和max来获取max(case

54100
您找到你想要的搜索结果了吗?
是的
没有找到

MySQL性能优化(七):MySQL执行计划,真的很重要,来一起学习吧

通过explain命令,根据执行计划找到存在性能问题SQL语句,以帮助我们优化SQL提供方向和依据。 如果面对执行计划,你也是一脸疑惑,甚至抓狂,那么你真的需要认真的来了解了。...从上面的例子中,我们看到返回有很多,为了更加清楚了解每一含义,便于我们更好完成优化SQL。 涉及到列有: 列名 含义 id id,表示查询中执行select子句或操作表顺序。...1. id id一个编号,用于标识SELECT查询序列号,表示执行SQL查询过程中SELECT子句或操作表顺序。 如果在SQL中没有子查询或关联查询,那么id都将显示一个1。...2)id不同 如果存在子查询id序号会递增id值越大优先级越高,越先被执行。...本质是也是一种索引访问,返回所有匹配某个单独值行,然而它可能会找到多个符合条件行,所以属于查找和扫描混合体。 此类型只有当使用非唯一索引或者唯一索引唯一性前缀才会发生。

5.3K71

explain 深入剖析 MySQL 索引及其性能优化指南

只有使为TRUE才会被插入VT7 SELECT:处理SELECT列表,产生VT8。...首先 sql 从里向外执行,而 id是一组数字,表示查询中执行select子句或操作表顺序。 如果id相同,则执行顺序从上至下。...如果是子查询id序号会递增id越大则优先级越高,越先会被执行。 id如果相同,则可以认为是一组,从上往下顺序执行,所有组中,id越高,优先级越高,越容易执行。...eq_ref:eq_ref 使用于多表join,被驱动表过滤字段是主键或唯一索引,查询效率很好。   ...Using temporary 看到这个时候,查询需要优化了。这里,MySQL需要创建一个临时表来存储结果,这通常发生在对不同集进行ORDER BY上,而不是GROUP BY上。

1.7K60

Python小白数据库入门

表中是固定,可变是行。要注意,我们通常需要中指定数据类型,在行中添加数据,即我们每次添加一条记录,就添加一行,而不是添加一。...,当然也可以删除表,或者修改表定义,比如原表只有,现在需要,就要修改表定义 概念理解 表: 可以理解为我们通常所说二维表,分为横纵(行列),用于存放数据 字段: 就是表中列名 主键...primary key autoincrement 意思是指将id这个定义为主键,并且从1开始自动增长,也就是说id这个需要人为手动去插入数据,它会自动增长。...default 'unknow' default关键字代表设置默认值,这里指定默认值是字符串'unkonw',当不插入这一数据,默认就是这个值。...(即一行)才会使用fetchone()方法,比如按id查询,因为id唯一查询结果只可能有一条数据或者为空,不可能有多条,这时使用fetchone方法是非常好

2K30

.NET6 开源之JSON 2 SQL (JORM框架)

全称 :Json Object Relational Mapping ,它是通过JSON 对象 去实现数据库一个关系映射 ,理想中完整JORM包含功能有 ·1、表权授权 2、字段级别授权 3...、查询返回备注 4、可以配置化 5、支持丰富SQL语法 6、数据验证 7、JSON作为数据库中间语言支持多种数据库 为什么要开发JORM 我们都知道 ORM用起来非常舒服,都是强类型,但是他缺点很显...、低代码平台或者人工智能产品中,很多都是需要各自拼SQL查询用Datable等 SqlSugar 开始支持JORM SqlSugar是一款 老牌 .NET 开源ORM框架,由果糖大数据科技团队维护和更新...1.1 带有函数查询 Json格式 { "Table":"order", Select:[ [{SqlFunc_AggregateMin:["id"]},"id"], [{SqlFunc_GetDate...,只有丰富产品才会形成良性竞争,让用户有更多选择

24410

MySQL调优系列——MySQL常用优化技巧

这是SELECT查询序列号 理解是SQL执行顺序标识,SQL从大到小执行 1. id相同时,执行顺序由上至下 2....(0,多) eq_ref:唯一性索引:对于每个索引键查询,返回匹配唯一行数据(有且只有1个,不能多 、不能0) const:仅仅能查到一条数据SQL ,用于Primary key 或unique...索引 (类型 与索引类型有关) system(忽略): 只有一条数据系统表 ;或 衍生表只有一条数据查询 NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引里选取最小值可以通过单独索引查找完成...在这种情况下,可以通过检查WHERE子句看是否引用某些或适合索引来提高你查询性能。...,估算找到所需记录所需要读取行数 十、Extra 该包含MySQL解决查询详细信息,有以下几种情况: Using where:不用读取表中所有信息,仅通过索引就可以获取所需数据,这发生在对表全部请求都是同一个索引部分时候

1.7K20

深入浅出表锁(Table Lock)

这样 就能确保在给定时间里,只有一个事务能执行写入,并防止其他用户读取正在写入同一资源。  需要注意是对于 InnoDB 引擎来说,读锁和写锁可以加在表上,也可以加在行上。  ...,意味着在书写插入语句需要为其赋值,SQL语句修改 如下所示。  ...INSERT INTO `teacher` (name) VALUES ('zhangsan'), ('lisi'); 上边插入语句并没有为id显式赋值,所以系统会自动为赋上递增值,结果如下所示...SELECT,REPLACE ... SELECT和LOAD DATA语句。同一只有一个语句可以持有AUTO-INC锁。...MDL 作用是,保证读写正确性。比 如,如果一个查询正在遍历一个表中数据,而执行期间另一个线程对这个 表结构做变更 ,增加了一 ,那么查询线程拿到结果跟表结构对不上,肯定是不行

92640

面试前必须知道MySQL命令【expalin】

前言 只有光头才能变强 刷面试题时候,不知道你们有没有见过MySQL这两个命令:explain和profile(反正就见过了).. 之前虽然知道这两个命令大概什么意思,但一直没有去做笔记。...在id列上也会有几种情况: 如果id相同执行顺序由上至下。 如果id不相同,id序号会递增id值越大优先级越高,越先被执行。 (一般有子查询SQL语句id就会不同) ?...当from子句中有子查询,table是 格式,表示当前查询依赖 id=N查询,于是先执行 id=N 查询 1.3.4type 该称为关联类型或者访问类型,指明了MySQL...ref:一种索引访问,也称索引查找,返回所有匹配某个单个值行。此类型通常出现在多表 join 查询, 针对于非唯一或非主键索引, 或者是使用了最左前缀规则索引查询。...const、system:该表至多有一个匹配行,在查询开始读取,或者该表是系统表,只有一行匹配。其中 const 用于在和 primary key 或 unique 索引中有固定值比较情形。

98120

MySQL-如何定位慢查询SQL以及优化

查询日志记录慢SQL 定位慢SQL可以通过慢查询日志来查看慢SQL,默认情况下,MySQL数据库不开启慢查询日志(slow query log),需要手动把打开 SET GLOBAL slow_query_log...etc/my.cnf) explain查看分析SQL执行计划 通过慢查询日志定位出查询效率较低SQL,可以使用explain查看SQL执行计划 id 1. id 值相同时,被视为一组从上向下执行...如果是子查询id 值会递增id 值越高,优先级越高 3. id为NULL最后执行 select_type 1. simple: 简单select, 查询中不包含子查询或者 union。...> unique_subquery > index_subquery > range > index > ALL system:这种类型要求数据库表中只有一条数据,是const类型一个特例,一般情况下是不会出现...filtered 该一个百分比,是满足条件记录数量与我们查询了多少记录数量比值 extra 该字段包含有关MySQL如何解析查询其他信息,一般会出现这几个值: ● Usingfilesort

52551

MySQL执行计划

执行计划包含信息: 如上图,执行计划查出来后包含如下信息: idselect 查询序列号,包含一组数字,表示查询中执行select 子句或表读取顺序。值有三种情况,第一种,id相同。...id相同,表示从上到下执行。即先查t1,再查t3,最后查t2,而并非我们写SQLt1、t2、t3顺序。 第二种,id递增。...ref rows:根据表统计信息及索引使用情况,大致估算出找到所需记录需要读取行数。 fltered:按表条件过滤行百分比 extra:包含了一些十分重要但又不适合在其他显示信息。...比如我建了一个复合索引idx_col1_col2_col3,执行select col1 from t1 where col1 = 'a' order by col3,我们建复合索引是三个,而这条sql...比如刚才tb_emp表,建立了idx_id_deptId索引,然后执行select id, deptId from tb_emp,就是using index。

1K20

InnoDB锁机制深入理解

3.1 准备工作 3.1.1 测试用表结构 示例基础是一个只有数据库表。...只有id是主键索引,code是普通索引(注意,一定不要是唯一索引),并初始化了两条记录,分别是(1,1),(10,10)。...这样,我们验证唯一键索引就可以使用id,验证普通索引(非唯一键二级索引)就使用code。...查看间隙锁 按照官方文档,where子句查询条件是唯一键且指定了值只有record锁,没有gap锁。 如果where语句指定了范围,gap锁是存在。...例如update test set code=100 where id=10;执行时候code=10索引(code是二级索引,见文中给出建表语句)会被加隐式锁,只有隐式锁产生冲突才会变成显式锁(

50710

MySQL索引

内容是唯一值 表创建时候至少要有一个主键索引,最好和业务无关。...1、查询需求多 (业务逻辑中,where条件后经常查询条件) 2、唯一值多       (1)统计下总行数       (2)计算不重复行数量 查看表唯一值数量: select count...这个不重要,查询序号即为sql语句执行顺序 id相同,执行顺序由上至下 如果是子查询id序号会递增id值越大优先级越高,越先被执行 id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id...许多where条件里涉及索引中,当(并且如果)读取索引,就能被存储引擎检验,因此不是所有带where字句查询都会显示"Using where"。...(优化)不走索引原因总结 企业级SQL优化思路 1、把一个不使用索引SQL语句按照功能进行拆分 2、长SQL语句无法使用索引,能不能变成2条短SQL语句让分别使用上索引 3、对SQL语句功能拆分和修改

3.8K50

学弟问我:explain 很重要吗?

、ref、rows、Extra 接下来将逐一分析这些结果代表含义,希望对你有帮助: 3.1 id 一组数字,表示 sql 语句中 select 执行顺序,有几个 select 就有几个 id...3.2 select_type 见名知义,就是 select 查询类型,结果有好多种,且听我分析,加粗都是常见,得知道意思。 simple:简单查询。...3.3 table 表示 explain 一行访问表是哪一个 当 from 子句中有子查询,table 是 格式,表示当前查询依赖 id=N 查询,于是先执行 id=...eq_ref:最多只返回一条符合条件记录。在使用唯一性索引或主键查找时会出现该值,非常高效。 const、system:该表至多有一个匹配行,在查询开始读取,或者该表是系统表,只有一行匹配。...04 总结 其实 explain 并不难,我们需要关注结果只有 select_type、type 以及 extra 。这是非常基础一个命令,各位在校生小伙伴非常建议你提前了解下。

64030

《深入浅出SQL》问答录

如果只有一张白表,为什么还要创建数据库? A:SQL语言要求所有的表都放在数据库中,这当然有理由。...自动递增关键字:AUTO_INCREMENT ---- 如果想改变顺序呢?...内联接 INNER JOIN利用条件判断中比较运算符结合两张表记录。只有联接记录符合记录条件才会返回。...自然联接 属于内联接一种。 自然联接只有在联接在两张表中名称相同时才会用。 ?...因为当SELECT语句结果是一个虚表,若没有别名,SQL就无法取得其中表。 为什么视图对数据库有好处? 如果创建了视图,就不需要重复创建复杂联接与子查询。视图隐藏了子查询复杂性。

2.9K50

MySQL Explain关键字

id 相同,执行顺序由上至下 ②id 不同,id 不同,如果是子查询id 序号会递增id 值越大优先级越高,越先被执行 ③有相同也有不同 id 如果相同,可以认为是一组,从上往下顺序执行;在所有组中...一个 sql 查询趟数越少越好。 2、select_type select_type 代表查询类型,主要是用于区别普通查询、联合查询、子查询复杂查询。...因为只匹配一行数据,所以很快 如将主键置于 where 列表中,MySQL 就能将该查询转换为一个常量。 eq_ref 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。...key 显示使用了哪个索引一般就是在你 where 语句中出现 了 between、、in 等查询这种范围扫描索引扫描比全表扫描要好,因为需要开始于索引某一点,而结束语另一点,不用扫描全部索引...7、ref 显示索引哪一被使用了,如果可能的话,是一个常数。哪些或常量被用于查找索引列上值。 8、rows rows 显示 MySQL 认为执行查询必须检查行数。越少越好!

1.7K20

SQL查询之执行顺序解析

但在SQL语言中,第一个被处理子句总数FROM子句,下面显示了逻辑查询处理顺序以及步骤序号 (8)SELECT (9)DISTINCT (1)FROM <left_table...该虚拟表作为一个处理输入。这些虚拟表对用户不是透明只有最后一步生成虚拟表才会返回给用户。如果没有在查询中指定某一子句, 则将跳过相应步骤。...如果需要连接表数量大于2,则对虚拟表VT3重做步骤1-步骤3,最后产生虚拟表作为下一个步骤输出 4 应用WEHRE过滤器 对上一个步骤产生虚拟表VT3进行WHERE条件过滤,只有符合<where_condition...8 处理SELECT列表 虽然SELECT查询中最先被指定部分,但是直到步骤8才真正进行处理。...这张内存临时表表结构和上一步产生虚拟表一样,不同是对进行DISTINCT操作列增加了一个唯一索引,以此来去除重复数据。 由于在这个SQL查询中未指定DISTINCT,因此跳过本步骤。

1.4K32

MySQL【第六章】——优化器及执行计划 - Explain

2) id 越大优先级越高,如果是子查询ID 序列号会递增id值越大,优先级越高,越先执行。      3) id 相同又有不相同,序列号大会先执行,然后相同从上到下执行。    ...3) eq_ref: 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见与主键或唯一索引扫描;      4) ref:    非唯一索引扫描,返回匹配某个单独值所有行,常见于使用非唯一查询...,,in 等查询这种范围扫描比全表扫描要好,         因为需要开始与索引某一点,而结束与另一点,不用扫描全部索引。  ...2) Using where    mysql 将在存储引擎检索行后再进行过滤,许多where条件里涉及索引中,当(并且如果)读取索引,就能被存储引擎检验,因此不是所有带where子句查询都会显示...DEMAND表示只有查询语句中明确写明SQL_CACHE语句才会放入查询缓存。 2)querycachesize:查询缓存使用总内存空间。

90220

手把手教你彻底理解MySQLexplain关键字

用法:EXPLAIN+ sql语句 EXPLAIN执行后返回信息如下: 各个字段大致含义如下: id: SELECT 查询标识符. 每个 SELECT 都会自动分配一个唯一标识符。...(2)id不同,数字越大优先级越高 如果sql中存在子查询,那么id序号会递增id越大越先被执行。如上图,执行顺序是t3、t1、t2,也就是说,最里面的子查询最先执行,由里往外执行。...在t2表content加上普通索引 进行查询 (5)fulltext 查询使用 fulltext 索引。 (6)ref_or_null 对于某个字段既需要关联条件,也需要null 值情况下。...key 显示使用了哪个索引,一般就是在你where 语句中出现了between、、in 等查询,这种范围扫描索引扫描比全表扫描要好,因为需要开始于索引某一点,而结束于另一点,不用扫描全部索引...举个例子,t3表content字段有普通索引,下面的查询语句结果如下 1.12 rows rows 列表示 MySQL 认为执行查询可能需要读取行数,一般情况下这个值越小越好!

71820

MySQL Explain查看执行计划

(QEP:sql生成一个执行计划query Execution plan) mysql> explain select * from user; expain出来信息有10,分别是idselect_type...序号会递增id值越大优先级越高,越先被执行 id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行 二、select_type SIMPLE(简单SELECT,...eq_ref: 类似ref,区别就在使用索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件 const、...system: 当MySQL对查询某部分进行优化,并转换为一个常量,使用这些类型访问。...在这种情况下,可以通过检查WHERE子句看是否引用某些或适合索引来提高你查询性能。

1.9K30
领券