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

「Mysql索引原理(八)」使用索引扫描做排序

MySQL有两种方式可以生成有序的结果:通过排序操作;或者按索引顺序扫描;如果explain出来的type列的值为index,则说明MySQL使用了索引扫描来做排序。...扫描索引本身是很快的,因为只需要从一条索引记录移动到紧接着的下一条记录。但如果索引不能覆盖查询所需的全部列,那就不得不每扫描一条索引记录就得回表查询一次对应的行了。...只有当索引的顺序和ORDER BY子句的顺序完全一致,并且所有列的排序方向都一样时,MySQL才能使用索引结果来做排序。...ORDER BY子句和查找型查询的限制是一样的:需要满足索引的最左前缀的要求;否则,MySQL都需要执行排序操作,而无法利用索引排序。...下面这个查询可以利用索引排序,是因为查询为索引的第一列提供了常量条件,而是用第二列进行排序,将两列组合在一起,就形成了索引的最左前缀: explain select rental_id,staff_id

1.3K10

MySQL 查询专题

如果不排序,数据一般将以它在底层表中出现的顺序显示。这可以是数据最初添加到表中的顺序。但是,如果数据后来进行过更新或删除,则此顺序将会受到MySQL重用回收存储空间的影响。...你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。 你可以设定多个字段来排序。 你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。...在指定一条 ORDER BY 子句时,应该保证它是SELECT语句中最后一条子句,否则这将报错 不限制是否使用非选择列进行排序 除了能用列名指出排序顺序外,ORDER BY 还支持按相对列位置进行排序,...下标从 0 开始,当根据不出现在 SELECT 清单中的列进行排序时,不能采用这项技术 如果想在多个列上进行降序排序,必须对每一列指定 DESC 关键字。...合并结果集 union 要求两个表的列数 和 列类型 完全一致 连接查询 内连接 方言版 select xxx列 from 表A, 表b where 条件1=xxx 标准版 逗号改成inner join

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

    MySQL还能这样玩---第三篇之索引也可以如此easy

    ,例如当前例子中,只有 (name),(name,age),(name,age,gae1)这样的查询索引才会生效,而(age),(age,age1)不会生效 匹配列前缀: 仅仅使用索引中的第一列,并且只使用第一列开头一部分字符进行查找...精确匹配某一列并范围匹配另外一列: 例如: 查询name=dhy并且age在18到20之间的记录,第一列name全匹配,第二列age范围匹配 只访问索引的查询: B-Tree通常支持"只访问索引的查询...因为这两个函数计算出来的哈希值是非常长的字符串,会浪费大量存储空间,而且查询更慢。SHA1()和MD5()是强加密函数,设计目标是最大限度消除冲突,但这里并不需要这样高的要求。...2,但是这对于排序来说,也是一种基于范围的查询,因此会导致无法利用索引进行排序,其实仔细想想也很合理,因为按照inventory_id=1查询出来的结果可以按照索引排序,同理inventory_id=2...也是,但是两个排好序的结果集合并在一起,又需要重新排序,因此倒不如直接查询出结果集,再排序 ---- 压缩前缀索引 ---- 冗余和重复索引 我们还需要考虑一个问题,就是索引过多带来的插入效率降低的问题

    62130

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

    ,MySQL会递归执行并将结果放到一个临时表中,称其为“派生表”,因为该临时表是从子查询中派生而来的。...换言之,是为了避免全表扫描,因为全面扫描是性能最差的。 2)index 全索引扫描,和全表扫描ALL类似,扫描表时按索引次序进行,而不是按行扫描,即:只遍历索引树。...通过explain结果来看,只查询表film中字段title时,是按照索引扫描的(type列为index),倘若查询字段description,却是按照全表扫描的(type列为ALL)。...这个数字是内嵌循环关联计划里的循环数,它并不是最终从表中读取出来的行数,而是MySQL为了找到符合查询的那些行而必须读取行的平均数,只能作为一个相对数来进行衡量。...4)Using filesort 对数据使用了一个外部的索引排序,而不是按照表内的索引进行排序读取。也就是说MySQL无法利用索引完成的排序操作成为“文件排序”。

    5.4K71

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

    前言 只有光头才能变强 刷面试题的时候,不知道你们有没有见过MySQL这两个命令:explain和profile(反正我就见过了).. 之前虽然知道这两个命令大概什么意思,但一直没有去做笔记。...NULL:在执行阶段不需要访问表。 1.3.5possible_keys 这一列显示查询可能使用哪些索引来查找 1.3.6key 这一列显示MySQL实际决定使用的索引。...Using Where:在存储引擎检索行后再进行过滤,使用了where从句来限制哪些行将与下一张表匹配或者是返回给用户。...Using temporary:在查询结果排序时会使用一个临时表,一般出现于排序、分组和多表 join 的情况,查询效率不高,建议优化。...Using filesort:对结果使用一个外部索引排序,而不是按索引次序从表里读取行,一般有出现该值,都建议优化去掉,因为这样的查询 CPU 资源消耗大。

    1K20

    【MySQL】01_运算符、函数

    SELECT A DOM B 加减运算符: 一个整数类型的值对整数进行加法和减法操作,结果还是一个整数; 一个整数类型的值对浮点数进行加法和减法操作,结果是一个浮点数; 加法和减法的优先级相同,进行先加后减操作与进行先减后加操作的结果是一样的...在对多列进行排序的时候,首先排序的第一列必须有相同的列值,才会对第二列进行排序。如果第 一列数据中所有值都是唯一的,将不再对第二列进行排序。...但 这样产生的结果和上述方法的并不一样。...单行函数 操作数据对象 接受参数返回一个结果 只对一行进行变换 每行返回一个结果 可以嵌套 参数可以是一列或一个值 数值函数 基本函数 角度与弧度互换函数 三角函数 指数与对数 进制间的转换...MySQL信息函数 MySQL中内置了一些可以查询MySQL信息的函数,这些函数主要用于帮助数据库开发或运维人员更好地 对数据库进行维护工作。

    2.5K30

    MySQL_库和表的使用(部分未完

    而MySQL支持将查询结果通过表达式进行展示 为表达式查询结果设置别名 这样可以增强查询结果的可读性 查询结果去重(select distinct) 有些使用场景下可能需要用到去重,比如上面,只是想知道总体上都是有哪几种总分...NOT NULL查询: where查询条件不一定必须存在于select要查询的字段中: 使用where时设置条件的字段,可以与select查询要获取的结果集字段无关,而是可以根据原有表中任意字段进行筛选...结果排序(order by) 按单字段升序【默认】/ 降序【后加DESC】 显示 降序在字段后加EDSC 按多字段排序 按照书写先后确定排序优先级 先按照数学将序排序,相等时,就再参考语文的升序,如果还是相等...,参考英语的升序 按求和结果排序 排序的时候可以使用别名,说明排序只是对于查询后的结果表进行排序,而不同于where(在查询时按条件筛选) where + order by 查询语文成绩大于70分的学生的...id、姓名、数学成绩 并将查询结果按照语文成绩,降序排列 where查询条件不一定必须存在于select要查询的字段中,而是可以根据原有表中任意字段进行筛选 排序也不一定按照select查询结果的字段进行排序

    12210

    肝通宵写了三万字把SQL数据库的所有命令,函数,运算符讲得明明白白讲解,内容实在丰富,建议收藏+三连好评!

    SELECT * FROM Customers WHERE City = 'Berlin' AND PostalCode= 12209; ORDER BY 关键字 该ORDER BY关键字用于按升序或降序对结果集进行排序...ORDER BY默认情况下,关键字按升序对记录进行排序。要按降序对记录进行排序,请使用 DESC关键字。 ORDER BY 语法 SELECT column1, column2, ......, CustomerName DESC; 练习 从Customers表中选择所有记录,按城市列的字母顺序对结果进行排序。...JOIN内连接关键字 INNER JOIN关键字选择在两个表中具有匹配值的记录。...该GROUP BY语句通常与聚合函数 ( COUNT(), MAX(), MIN(), SUM(), AVG()) 一起使用, 以按一列或多列对结果集进行分组。

    9.9K20

    简单了解SQL性能优化工具MySql Explain

    如果这一列用来说明的是其他行的联合结果,该值可能为null。...关联优化器会为查询选择关联顺序,左侧深度优先 当from中有子查询的时候,表名是derivedN的形式,N指向子查询,也就是explain结果中的下一列 当有union result的时候,表名是union...All:最坏的情况,全表扫描 index:和全表扫描一样。只是扫描表的时候按照索引次序进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。...Using filesort MySQL有两种方式可以生成有序的结果,通过排序操作或者使用索引,当Extra中出现了Using filesort 说明MySQL使用了后者,但注意虽然叫filesort但并不是说明就是用了文件来进行排序...使用文件完成排序操作,这是可能是ordery by,group by语句的结果,这可能是一个CPU密集型的过程,可以通过选择合适的索引来改进性能,用索引来为查询结果排序。

    1.5K20

    【MySQL】索引啊 d=====( ̄▽ ̄*)b

    [TOC] 为什么需要索引 根据上面索引的定义,可以知道索引其实是一种数据结构,主要用于提高表中的查询效率,除此之外,索引还是数据库随机高速读取和对记录进行有效排序的基础。...O(n)的复杂度降低到 \lg n 而 o(n)的复杂度就意味着每次查询需要进行 n 次磁盘IO,使用排序树后虽然不能像哈希表一样达到 O(1) 的复杂度,但相比不使用索引可以大大减少磁盘 IO 的次数...: 在进行等值查询如= 或 IN 时, 可以不考虑顺序,SQL 查询优化器会自动调整语句顺序,如执行下面两条语句的效果是一样的(根据索引长度我们可以推断出对哪几个列使用了索引): 可以查询建立了聚合索引的某几列...MySQL 中使用指针连接了叶子节点,所以对于按范围查询的列,建立索引后可以进一步降低磁盘 IO。...成本优先 索引的出现本就是为了降低查询成本的,但若在某些情况下使用索引反而增加了查询成本,那就不应该使用索引,MySQL 在执行查询前会预估查询成本,然后根据成本决定是否使用索引或使用哪个索引,不使用索引时的查询成本包括两部分

    1K30

    MySQL 索引的类型

    例如下图,基于文本域的索引树上,按字母顺序传递连续的值进行查找是非常合适的,所以像“找出所有以A到C开头的名字”这样的查询效率会非常高。...索引对多个值进行排序的依据是 CREATE TABLE 语句中定义索引时列的顺序,看一下最后两个条目,两个人的姓和名都相同时,则根据他们的出生日期来排列顺序。 ?...特点:【1】对于搜索字符串中的字符都解析为正常的字符,没有特殊意义; 【2】对屏蔽字符列表中的字符串进行过滤; 【3】当记录的选择性超过50%的时候,通常被认为是不匹配; 【4】返回记录按照记录的相关性进行排序显示...特点:会按照一定的规则解析搜索字符串中的特殊字符的含义,进行一些逻辑意义的规则。如:某个单词必须出现,或者不能出现等。这种类型的搜索返回的记录是不按照相关性进行排序的。...可以根据第一次搜索结果的记录词进行第二次匹配,从而可能找到一些间接关系的匹配记录。 五、其他索引类型 ---- 还有第三方的存储引擎使用不同类型的数据结构来存储索引。

    1.4K30

    学数据库还不会Select,SQL Select详解,单表查询完全解析?

    细化聚集函数的作用对象 未对查询结果分组,聚集函数将作用于整个查询结果 对查询结果分组后,聚集函数将分别作用于每个组 作用对象是查询的中间结果表 按指定的一列或多列值分组,值相等的为一组 合计函数...: CustomerQuantity张三31 ORDER BY子句:对查询结果表按指定列值的升序或降序排序 还是对BILL表操作 CustomerQuantityDate张三102020-3-19...升序:ASC;降序:DESC;缺省值为升序 当排序列含空值时 ASC:排序列为空值的元组最后显示 DESC:排序列为空值的元组最先显示 二、单表查询 刚才在介绍那几个保留字的时候,我们简单的举了几个查询的例子...BY [ ASC|DESC ] ];--按什么条件排序 其中目标表达式可以为: 算术表达式 字符串常量 函数 列别名 例子: Students表 Name Birth 李勇 1999 刘晨...如acb,afb等都满足该匹配串 ESCAPE 短语: 当用户要查询的字符串本身就含有 % 或 _ 时,要使用ESCAPE ‘’ 短语对通配符进行转义。

    97030

    数据库SQL语言从入门到精通--Part 6--单表查询(快来PICK)

    细化聚集函数的作用对象 未对查询结果分组,聚集函数将作用于整个查询结果 对查询结果分组后,聚集函数将分别作用于每个组 作用对象是查询的中间结果表 按指定的一列或多列值分组,值相等的为一组 合计函数...: CustomerQuantity张三31 ORDER BY子句:对查询结果表按指定列值的升序或降序排序 还是对BILL表操作 CustomerQuantityDate张三102020-3-19...升序:ASC;降序:DESC;缺省值为升序 当排序列含空值时 ASC:排序列为空值的元组最后显示 DESC:排序列为空值的元组最先显示 二、单表查询 刚才在介绍那几个保留字的时候,我们简单的举了几个查询的例子...BY [ ASC|DESC ] ];--按什么条件排序 其中目标表达式可以为: 算术表达式 字符串常量 函数 列别名 例子: Students表 Name Birth 李勇 1999 刘晨...如acb,afb等都满足该匹配串 ESCAPE 短语: 当用户要查询的字符串本身就含有 % 或 _ 时,要使用ESCAPE ‘’ 短语对通配符进行转义。

    83410

    理解MySQL——索引与优化

    (3)尽量避免NULL:应该指定列为NOT NULL,除非你想存储NULL。在MySQL中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。...由于B-树中的节点都是顺序存储的,所以可以利用索引进行查找(找某些值),也可以对查询结果进行ORDER BY。当然,使用B-tree索引有以下一些限制: (1) 查询必须从索引的最左边的列开始。...MySQL 中,有两种方式生成有序结果集:一是使用filesort,二是按索引顺序扫描。...不能使用索引进行排序时,就会利用自己的排序算法(快速排序算法)在内存(sort buffer)中对数据进行排序,如果内存装载不下,它会将磁盘上的数据进行分块,再对各个数据块进行排序,然后将各个块合并成有序的结果集...当对连接操作进行排序时,如果ORDER BY仅仅引用第一个表的列,MySQL对该表进行filesort操作,然后进行连接处理,此时,EXPLAIN输出“Using filesort”;否则,MySQL

    97720

    还有这些MySQL高性能索引优化策略等你试用

    B-TREE通常就意味着里面存储的所有值都是有序的,并且查询的时候,不用全表扫描,而是按照索引结构查找,所以会更快。 适用查询: 全值匹配:是指和索引中的所有列进行匹配。...匹配列前缀:举个例子就是,像like 'abc%'可以用到索引,而like '%abc%'就无法用到该类索引。 匹配范围值:其实就是范围查询。...当然如果查询满足以上条件,那也就可以用这些列进行排序。 2、哈希索引 哈希索引是基于哈希表实现的,只支持精确索引查询。在MySQL中,目前只有Memory引擎支持哈希索引,但我们可以自定义哈希索引。...具体思路是这样的: 在表中创建一列用来存储哈希值,然后还是用B-TREE索引进行查找。...7、使用索引扫描来做排序 ORDER BY和查找型查询的限制是一样的:需要满足索引的最左前缀原则,否则,MySQL无法使用索引排序。但有一个特殊情况,就是前导列为常量。

    71220

    一文带你深入理解Mysql索引底层数据结构与算法

    我们在查找where Col2 = 22的记录时只需要对22做哈希运算得到该索引所对应那行数据的文件指针,从而在MySQL的数据文件中定位到目标记录,查询效率非常高。...使用联合索引时,联合索引定义的顺序将会影响到最终查询索引的使用情况和结果,例如定义了联合索引(a,b,c) ,mysql会先从左边的列优先匹配,如果最左边定义的列都没有被使用到,在未使用覆盖索引的情况下...mysql会优先以联合索引的第一列开始匹配,此后才会匹配下一列,如果不指定第一列匹配的值,那么也就无法知道下一步要查询那个节点(可以联想B+树的数据结构,第一列匹配到值后,会进行一次数据结构的排序筛选,...得出排好序的数据结构,在进行匹配下一列,得出最终结果,那么如果直接跳过第一列,匹配第二列,b+树会无法找到排好序的数据结构结果,就会进行全表扫描) 另外一种情况,如果遇到 ">"、"的范围查询,那么b+树也就无法对下一列进行等值匹配了(可以联想到,就算建立了索引,因为是范围查询,mysql会认为走索引会导致回表查询过多,导致效率并不会比全表扫描快,最终mysql就会走全表扫描

    70610

    MySQL EXPLAIN执行计划详解

    在查询中,每个表的输出只有一行,若多表关联,则输出多行。别名表单算为一个表,因此如果把表和自己连接,输出中也会有两行。这里的表的定义非常的广:可以是一个子查询,一个 UNION 结果。...MySQL会递归执行并将结果存放在一个临时表中,也称为派生表,因为该临时表是从子查询中派生来的。 UNION,UNION中的第二个或后面的SELECT。...index:跟全表扫描一样,只是MySQL扫描表时按照索引次序进行而不是行,主要优点是避免了排序;缺点是要承担按索引次序读取整个表的开销。这通常意味着如实按照随机次序访问行,开销较大。...Using filesort:MySQL会对结果使用一个外部索引排序,而不是按索引次序从表里读取行,即filesort(文件排序)。...filesort有两种,一种是内存排序,一种是磁盘排序,无法得知。 Distinct: 一旦MySQL找到了与行相联合匹配的行,就不再搜索了,常见于关联查询。

    1.7K140
    领券