MySQL在有索引列情况下 和 无索引情况下 select *的输出结果顺序

MySQL进阶:深入索引 - 匹配顺序 索引匹配顺序指的是在使用联合索引(复合索引)时,查询条件中的列顺序与索引定义中的列顺序之间的关系。MySQL查询优化器会根据索引的定义和查询条件来决定如何使用索引。通过合理设置和管理MySQL的索引匹配顺序,可以有效提升系统的性能和稳定性,减少磁盘I/O和内存消耗。希望本文能帮助你更好地理解和利用索引匹配顺序,让你在数据库管理的道路上更进一步。🌟如果你有任何疑问或想要分享的经验,欢迎留言交流!💬通过上述内容,我们不仅介绍了MySQL索引匹配顺序的基本概念和工作原理,还详细说明了具体的应用场景和优化技巧。 阅读详情

本文章讨论 MySQL在有索引列情况下 和 无索引情况下 select *的输出结果顺序。


1:在有索引列情况下。

创建一个表格,一个是主键列,一个是索引列。然后插入一批数据,调用select * from test_b,可以发现输出结果并没有按照Id有序,而是按照Type有序。

如果希望按照Id有序,可以使用force index (primary)这一hint语句。

mysql> CREATE TABLE `test_b` (
    ->   `Id` int(11) NOT NULL,
    ->   `Type` int(11) DEFAULT NULL,
    ->   PRIMARY KEY (`Id`),
    ->   KEY `IDX_Type` (`Type`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.20 sec)

mysql> insert into test_b values(1,1),(2,6),(3,2),(7,3),(4,1);
Query OK, 5 rows affected (0.09 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select * from test_b;
+----+------+
| Id | Type |
+----+------+
|  1 |    1 |
|  4 |    1 |
|  3 |    2 |
|  7 |    3 |
|  2 |    6 |
+----+------+
5 rows in set (0.03 sec)

mysql> select * from test_b force index (primary);
+----+------+
| Id | Type |
+----+------+
|  1 |    1 |
|  2 |    6 |
|  3 |    2 |
|  4 |    1 |
|  7 |    3 |
+----+------+
5 rows in set (0.00 sec)


观察select * from test_b的前两条结果:(1,1),(4,1),当Type相等的时候,按照Id排序。为了确认这一点,再多插入点数据观察,结论相同。

mysql> insert into test_b values(9,3),(6,3),(10,3);
Query OK, 3 rows affected (0.04 sec)
Records: 3  Duplicates: 0  Warnings: 0


mysql> select * from test_b ;
+----+------+
| Id | Type |
+----+------+
|  1 |    1 |
|  4 |    1 |
|  3 |    2 |
|  6 |    3 |
|  7 |    3 |
|  9 |    3 |
| 10 |    3 |
|  2 |    6 |
+----+------+
8 rows in set (0.00 sec)


默认情况下为什么会结果按照索引列有序呢?这还要从数据库内部的运行机制说起。首先系统会查询索引表(test_b_indexed_type),该索引表的主键是索引列type(通常为了保证主键唯一性,type后面会添加一个id后缀),通过索引列查到Id,然后拿着这些Id去test_b中查询最终结果。为了最高效,扫描索引表的时候会顺着type主键往下扫,

然后拿扫得的id去“逐个”请求test_b,于是自然就出现了按照索引列有序的结果。当Type列的值一致的时候,插入到索引列的数据可以根据Id顺序插入到索引表中,

保证了当Type一致的时候,会按照Id排序。


2:在无索引的情况下。Mysql会以主键当成索引来按主键从小到大输出结果。

CREATE TABLE `test_a` (
      `Id` int(11) NOT NULL,
      `Type` int(11) DEFAULT NULL,
       PRIMARY KEY (`Id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into test_a values(1,1),(2,6),(3,2),(7,3),(4,1);

mysql> select * from test_a;
+----+------+
| Id | Type |
+----+------+
|  1 |    1 |
|  2 |    6 |
|  3 |    2 |
|  4 |    1 |
|  7 |    3 |
+----+------+

看到上面的Id是按从小到大输出的了吧!


下面是别人的总结:


Select 语句如果不加 “Order By”, MySQL会怎么排序呢?

* 不能依赖 MySQL 的默认排序
* 如果你想排序,总是加上 Order By
* GROUP BY 强加了 Order By,

对于 MyISAM 表
MySQL Select 默认排序是按照物理存储顺序显示的。(不进行额外排序).
也就是说
SELECT * FROM tbl – 会产生“表扫描”。如果表没有删除、替换、更新操作,记录会显示为插入的顺序。

InnoDB 表
同样的情况,会按主键的顺序排列。但是这是不靠谱的,它是潜规则。

“Select” 不加 “Order by”时, MySQL 会尝试以尽可能快的方法(MySQL 实际的方法不见得快)返回数据。
由于访问主键、索引大多数情况会快一些(在Cache里)所以返回的数据有可能以主键、索引的顺序输出,
这里并不会真的进行排序,主要是由于主键、索引本身就是排序放到内存的,所以连续输出时可能是某种序列。
在一些情况下消耗硬盘寻道时间最短的数据会先返回。 如果只查询单个表,在特殊的情况下是有规律的。

最后总结

“Order By 是要加的”

我们对于翻页等逻辑必须默认加上order by排序,而且order by的字段如果有重复值,必须指定第二排序字段,如果第二排序字段还有重复值,那必须指定更多的字段,直到所有的排序字段能够指定唯一顺序。


思博伦Spirent TestCenter创建单播流uni-stream Traffic Generator列表中会出现刚才创建的uni-stream,创建完成。通常测试情况下,主要对Ethenet II和IPv4 Header进行配置。(通常情况下,如果流配置比较规范,选择任意端口接收,也没问题。编辑uni-stream基本信息。配置本条流由STC哪个端口接收。 阅读详情

相关推荐

高能物理相关软件

国内高能物理实验背景     研究物质最深层次结构及相互作用的前沿基础科学。 现代高能物理实验的要素    实例源 、 探测器、   电子学、  触发 DAQ、  原始数据、 刻度、重建 、物理分析、  成果  。 离线软件的地位和作用。    是硬件设备和物理学家的桥梁,是从数据到物理成果转化中的关键和重要的环节。 高能物理实验及其特点 独一无二性,实验规模越来越大,努力省钱(使用

Alan Zhuang的博客 3298

一次由 select * 走了索引而引发的思考

select * 走索引

吉衣の秋先生的博客 1964

网工实验笔记:SNMP的配置

简单网络管理协议SNMP(Simple Network Management Protocol)是广泛应用于TCP/IP网络的网络管理标准协议。SNMP提供了一种通过运行网络管理软件的中心计算机(即网络管理工作站)来管理设备的方法。

2301_76170756的博客 2114

Mysql开发规范

文章目录数据库对象全局全名规范数据库命名规范表命名规范:索引设计规范select 检索的规范性操作的规范性 数据库对象全局全名规范 1、命名使用具有意义的英文词汇,词汇中间以下划线分隔 2、命名只能使用英文字母、数字、下划线,以英文字母开头 3、避免用MySQL的保留字如:backup、call、group等 4、所有数据库对象使用小写字母,实际上MySQL中是可以设置大小写是否敏感的,为了保证统一性,我们这边规范全部小写表示。 数据库命名规范 1、数据库命名尽量不超过30个字符。 2、数据库命名一般为项目

amunamuna的博客 938

从零构建:四轴机械臂D-H参数建模与MATLAB实战指南

本文详细介绍了四轴机械臂D-H参数建模的完整流程与MATLAB实战应用。从机械臂运动学基础出发,解析D-H参数原理与坐标系建立规则,提供MATLAB Robotics Toolbox的安装、模型创建及正逆运动学求解的代码实现。特别针对四轴机械臂的逆运算优化、轨迹规划和奇异位形规避等高级应用给出实用解决方案,是机器人开发者的实战指南。

weixin_29062255的博客 419

医学图像处理实战:3D Slicer从安装到病灶分析全流程指南

本文提供了一份详尽的3D Slicer实战指南,涵盖从软件安装、DICOM数据导入到图像增强、病灶分割及三维可视化的全流程。重点演示了如何利用阈值分割、区域生长等核心图像处理技术进行病灶分析,并生成定量报告,是医学影像分析初学者的实用入门教程。

weixin_29278805的博客 600

MYSQL索引

索引类型 1、普通索引 普通索引查出出来的是主键值,然后再到主键索引去查找对应的值 聚集索引是索引跟数据放在一起(Innodb),非聚集索引是数据跟索引分开的(MyIsam) 聚合会比较快 B+树的索引数据结构,也有hash索引的数据结构 B树与B+树最大的区别是 B树在跟和叶子节点都会存储数据 B+树在叶子节点才存储数据 possible_key 可能用到的索引 key 实际用到的索引 设置ID为主键 为什么要自增 尽量减少页合并和...

qq_40743080的博客 1769

rk3568 rockit编译测试

编译rockit不能使用SDK默认编译kernel的交叉编译,需要采用编译buildroot的,而编译buildroot的编译器SDK并没有存放,需要编译过buildroot之后才可以用。命令参数相关解析可查阅代码,这里提醒一下-l参数,这是程序运行计数,默认是100,时间很短,基本上显示画面一闪而过,一度以为是程序哪里出问题了,改用-l 1000,画面显示时间加长。此处跳过系统,单领出来编译。rockit组件包在4.10版本需要手动编译,奈何我的版本怎么都编译不了,后来改用5.10版本才编译通过。

zfenggo的博客 4196

【MySQL性能优化系列】select count(*)走二级索引比主键索引快几百倍,你敢信?

在MySQL版本5.7数据测试过程中,一张百万数据的表用 select count(*)查询特别慢需要20s并且是走了主键索引,为什么查询还需要这么久?如何优化?下面我们将请到当事SQL进行发言

7me 8042

硬件工程师笔记——运算放大电路Multisim电路仿真实验汇总

本文系统介绍了运算放大电路的基础知识及其应用。主要内容包括:1)运算放大器的基本结构、理想特性及分析方法(虚短、虚断、叠加定理);2)比例运算电路(同向、反向、差分)的工作原理与仿真分析;3)求和运算、加减运算电路的实现方法;4)积分、微分、指数和对数运算电路的基本原理;5)过零电压比较器的功能特点。通过理论分析和仿真实验,详细阐述了各类运算放大电路的输入输出特性、相位关系和增益计算,为硬件工程师提供了实用的电路设计参考。

XU157303764的博客 2477

EfficientNet 改进:添加混合卷积提取特征

混合卷积(Mixed Convolution)是一种在卷积神经网络(CNN)中结合多种卷积操作的策略,旨在通过融合不同卷积核大小或类型的卷积操作来提升模型的性能和灵活性。:例如标准卷积、深度可分离卷积(Depthwise Separable Convolution)、分组卷积(Grouped Convolution)等,可以在计算效率和特征提取能力之间取得平衡。混合卷积可以根据任务需求动态调整卷积操作的组合方式,适应不同的输入数据分布。:通过引入可学习的权重,动态调整不同卷积操作的贡献。

Henry的博客 659

mysql查询的时候索引工作机制_mysql查询中利用索引的机制_MySQL

今天遇到一个奇怪的问题,明明已经建立了索引,select语句的explain也表明会利用这个索引,可是结果偏偏没有用索引,最后扫描了全表。两个结构完全一样的sql语句:sql1: select * from table where col_a = 123 and col_b in (‘foo’,/'bar’) order by id desc;sql2: select * from table w...

weixin_42521628的博客 152

DSP开发环境及工具之CCS

CCS( Code Composer Studio)是美国德州仪器(TI)公司的嵌入式处理器的开发环境,可以用于TI公司的各个系列处理器的软件开发和调试,如DSP,MCU,ARM等。CMD的专业名称叫链接器配置文件,是存放链接器的配置信息的,我们简称为命令文件。从其名称可以看出,该文件的作用是指明如何链接程序的。编辑完C语言设置,添加cmd文件之后,然后检查编译配置选项。主要的操作都是在这个窗口之间做相应的切换。

小柚子的博客 4311

MySQL在有索引列情况下select *的输出结果顺序

创建一个表格,一个是主键列,一个是索引列。然后插入一批数据,调用select * from test_b,可以发现输出结果并没有按照Id有序,而是按照Type有序。 如果希望按照Id有序,可以使用force index (primary)这一hint语句。 mysql> CREATE TABLE `test_b` ( -> `Id` int(11) NOT NULL,

余璜的技术博客 4085

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Mysql运行select时加一列0值,MySQL在有索引列情况下select*的输出结果顺序_MySQL

bitsCN.comMySQL在有索引列情况下select *的输出结果顺序创建一个表格,一个是主键列,一个是索引列。然后插入一批数据,调用select * from test_b,可以发现输出结果并没有按照Id有序,而是按照Type有序。如果希望按照Id有序,可以使用force index (primary)这一hint语句。[sql]mysql> CREATE TABLE `test_b...

weixin_34792546的博客 433

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

select * 和select 1,select count(*)和select count(1)

1、select * 和select 1的区别 如果要返回数据,使用select * ,如果要判断有没有结果使用select 1; 2、select count(*)和select count(1)的区别 一般情况下,select count(*)和select count(1)两个返回的结果是一样的。

m0_63725962的博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Mysql--实战篇--SELECT * 与SELECT全部字段的区别

虽然SELECT * 和显式列出所有字段在功能上相似,但在实际使用中,显式列出字段具有以下优势:(1)、性能更好:可以通过覆盖索引优化查询,减少I/O操作和网络传输开销。(2)、可维护性更强:代码更清晰,易于理解和调试,且不受表结构变化的影响。(3)、避免潜在问题:减少隐式类型转换的风险,提高缓存命中率,确保查询结果符合预期。因此,除非有特殊需求,否则建议尽量避免使用SELECT *,而是显式列出你需要的字段。这不仅可以提高查询性能,还可以使代码更具可读性和可维护性。

weisian的博客 3万+

MySQL联合索引中不同区分度列的顺序对查询性能的影响

当构建联合索引时,需要考虑索引的顺序问题,除了考虑使用场景,索引的顺序是如何影响查询性能的呢?先来做个小实验。插入100w条数据,其中random_string字段为随机字符串,区分度高,而binary_int为0和1,区分度低,数据采样如下可以看到等值查询的执行扫描行数都是一样的,即无影响。如果对random_string进行范围查询呢?可以看到当索引顺序是 (random_string, binary_int)时,扫描的行数会多些,是先利用索引筛选出的数据行,然后使用进行过滤;

weixin_41866717的博客 1312

MYSQL ——select查询

需要注意的是,尽管可以查询指定列的数据,但是这并不意味着仅查询这些列的效率一定比查询所有列的效率高。因此,在实际应用中,需要慎重考虑筛选条件和聚合函数的使用,以便获得更好的查询性能。因此,在编写 SQL 语句之前,需要对数据库结构有一定的了解,并根据具体需求来设计表结构、索引、视图等数据库对象。此外,在查询过程中还需要遵循数据库的约束条件,例如表关系、数据类型等,以保证查询结果的正确性。是非常方便的查询方式,但是并不推荐在实际应用中频繁使用,因为它可能会返回大量的数据,从而影响查询性能和网络带宽。

lsj614的博客 6132

MySQL调优之索引在什么情况下会失效?

MySQL中提高性能的一个最有效的方式是对数据表设计合理的索引。索引提供了高效访问数据的方法,并且加快查询的速度,因此索引对查询的速度有着至关重要的影响。 * 使用索引可以快速地定位表中的某条记录,从而提高数据库查询的速度,提高数据库的性能。 * 如果查询时没有使用索引,查询语句就会扫描表中的所有记录。在数据量大的情况下,这样查询的速度回很慢。 大多数情况下都(默认)采用B+树来构建索引。只是空间列类型的索引使用R-树,并且MEMORY表还支持hash索引。 其实,用不用索引,最终都是优化器说了算。优化

小小默:进无止境 2884

CTO说了,谁在用select * 就走人

点击“终码一生”,关注,置顶公众号 每日技术干货,第一时间送达! 对于在 RDBMS 查询中使用 SELECT *,我们大多数人都不会三思而后行,但也许我们应该这样做。今天这篇文章讨论下为什么。 1、为什么不? 为什么呢?很多 SQL Server 和其他 RDBMS(关系数据库管理系统)的人建议永远不要使用,当我在演示中使用它并告诉我的与会者不要使用SELECT * 时,它已成为我演讲中的一个噱头。SELECT * 让我们来看看为什么不建议使用SELECT *,特别是在生

终码一生 3800

MySQL索引学习笔记03——高性能的索引策略(多列索引&索引列顺序)

1. 多列索引 多列索引不是为每个列创建独立的索引,或者按照错误的顺序创建多列索引;在多个列上建立独立的单列索引大部分情况下并不能提高MySQL的查询性能。MySQL 5.0及以上版本引入了一种叫“索引合并”(index merge)的策略,一定程度上可以使用表上的多个单列索引来定位指定的行 早版本的MySQL只能使用其中某一个单列索引,但哪一个独立的单列索引是非常有效的。如表film_actor在字段film_id和actor_id上各有一个单列索引,但对于其查询WHERE条件,这两个单列索引都不是好

weixin_44802953的博客 471

如何优化MySQL优化器对索引和JOIN顺序选择

MySQL优化器是数据库引擎中的一个模块,它通过分析查询语句并评估不同执行计划的成本,选择最优的执行路径。优化器的目标是最小化查询的执行时间和资源消耗。MySQL允许自定义优化器成本模型,通过调整成本常量来影响优化器的决策。调整成本常量以优化索引选择和JOIN顺序。

My_wife_QBL的博客 1596

创建组合索引时,索引列顺序的选择

在创建组合索引时,网上一般的说法会提到:查询时where条件中的列的顺序要和创建索引时列的顺序保持一致,否则组合索引会失效。 更进一步来说,组合索引的各个列中,到底谁应该在前,谁应该在后,还是说创建时顺序根本没有影响,只要查询时不违反上述提到的规则即可? 对于mysql的InnoDB引擎来说,组合索引的B+树结构上的叶子节点是按照第一个列的值大小进行排序,譬如对于组合索引(a,b,c),a,b,c...

miaoyibo12的博客 6282

MySQL 查询结果为何不按自增索引顺序排列?深度解析与解决方案

MySQL的自增主键并不保证查询结果的顺序,核心原因在于SQL标准未规定默认排序。自增主键仅保证唯一性和插入性能,而查询顺序可能因索引使用、优化器计划或物理存储变化而不同。解决方案包括:1)显式使用ORDER BY强制排序;2)为排序字段建立索引;3)避免依赖隐式顺序,尤其在分页查询时;4)通过EXPLAIN分析执行计划。最佳实践是始终明确指定排序规则,理解自增字段与排序逻辑的独立性,才能确保查询结果的一致性。

得塔云的博客 878

mysql 在哪些情况下使用了索引,但是索引还会失效

通过合理设计索引、优化查询语句和分析执行计划,可有效避免索引失效问题。:MySQL 需要将索引列转换为与条件匹配的类型,导致无法使用索引。:MySQL 无法同时使用多个索引,若有一个条件无索引,则全表扫描。:索引存储的是列的原始值,函数或运算后的值无法直接匹配索引结构。:联合索引的存储结构要求按索引定义的顺序匹配。:B+树索引无法高效匹配前缀不确定的模糊查询。:范围查询后的列在索引中无序,无法直接匹配。:查询条件中的数据类型与索引列类型不匹配。连接的条件中包含未索引的列。)后的列无法使用索引。

yinjinshui的博客 846
上一篇: 优化mysql的limit offset
下一篇: mysql优化limit查询语句的5个方法
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值