《MySQL——使用联合索引、覆盖索引,避免临时表的排序操作》

联合索引避免临时表排序

在上一篇笔记(MySQL——order by逻辑(全字段排序与rowid排序))中,讲到查询语句查询多个字段的时候使用order by语句实现返回值是有序的,而order by是使用到了临时表的,会带来时间和空间损失。
其实使用联合索引,就可以避免临时表的排序操作。
只要保证city这个索引上取出来的行天然就是按照name递增排序的话,就可以不用再排序了。

alter table t add index city_user(city,name);

在这个索引里面,通过树搜索的方式定位到第一个满足city = '杭州’的记录,并且额外确保了,接下来按顺序取“下一条记录”的遍历过程中,只要city值是杭州,name值一定有序。
查询流程变为:
1、从索引(city,name)找到第一个满足city = '杭州’条件的主键id;
2、到主键id索引取出整行,取name、city、age三个字段值,作为结果集的一部分直接返回
3、从索引(city,name)取下一个记录主键id;
4、重复step2、3直到查到第1000条记录,或者不满足city = '杭州’条件时循环结束。

覆盖索引优化查询

可以使用覆盖索引继续优化查询的执行流程:
覆盖索引指,索引上的信息足够满足查询请求,不需要再回到主键索引上取数据。
针对select city,name,age from t 这个查询,可以创建一个city、name和age的联合索引,对应语句为:

alter table t add index city_user_age(city,name,age);

这时,对于city字段的值相同的行来说,还是按照name字段的值递增排序。查询语句的执行流程变为:
1、从索引(city,name,age)找到第一个满足city = '杭州’条件的记录,取出其中的city、name和age三个字段值,作为结果集的一部分直接返回
2、从索引(city,name,age)取下一个记录,同样取出这三个字段的值,作为结果集的一部分直接返回
3、重复步骤2,直到查到第1000条记录,或者是不满足city = '杭州’条件时循环结束。

当然,并不是说每个查询能用上覆盖索引,就要把语句中涉及的字段都建上联合索引。因为索引有维护代价。

思考

假设表里面已经有了city_name(city,name)联合索引。你需要查询杭州和苏州两个城市中所有市民的名字,并且按名字排序,显示前100条记录。

select * from t where city in('杭州','苏州') order by name limit 100;

这个语句会有排序。因为条件是苏州或杭州。如果只有一个条件如只有杭州,那么就不需要排序操作。
如果我们需要实现一个在数据库端不需要排序的方案,可以这么实现:
把这一条语句拆成两条语句,流程如下:
1、执行select * from t where city = '杭州' order by name limit 100;
(这个语句不需要排序,客户端用一个长度为100的内存数组A保存结果)
2、执行select * from where city = '苏州' order by name limit 100;
(相同的方法,结果被存入内存数组B)
3、对AB两个有序数组采用归并排序,得到name最小的前100值,这就是我们需要的结果了。

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

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

相关文章

明源面试

明源面试,笔试题目如下 一、SQL测试题 1 有两张表 根据给出的SQL语句,写出返回的行数分别是多少?为了形象直观的显示,我给出了sql语句执行结果。 A 学生表 B分数表 新题目 select a.* from a inner join b on a.idb.id; …

AEAP的完整形式是什么?

AEAP:尽早 (AEAP: As Early As Possible) AEAP is an abbreviation of "As Early As Possible". AEAP是“ April越早”的缩写 。 It is an expression, which is commonly used in messaging or chatting on social media networking sites like Faceboo…

jquery 视觉特效(鼠标悬停时依次显示图片)

效果描述: 有几副图片,让他们依次叠加重合。首先显示第一张图片。然后鼠标悬停在上面,边框变化。然后离开,然后第一张淡出,第二张淡入。接着悬停在第二张图片,边框变化,然后离开,第二…

《MySQL tips:查询时,尽量不要对字段进行操作》

维护一个交易系统,交易记录表tradelog包含交易流水号(tradeid)、交易员id(operator)、交易时间(t_modified)等字段。 建表语句如下: create table tradelog (id int(11) not null,tradeid varchar(32) default null,operator int(11) default null,t_mo…

cocos2dx blender 骨骼动画实现

前言 cocos2d-x 中相关部分代码介绍 背景知识介绍 参考 http://www.3dkingdoms.com/weekly/weekly.php?a4 一 简单3d 模型支持 第一步实现对3d 模型的简单支持,完成一个CCSprite3D 类 参考CCSprite 类 以及 CCGLProgram 代码 主要修改 draw 方法。 添加了定点数组…

关于web.config中customErrors节点说明

关于web.config中<customErrors>节点说明 <customErrors>节点用于定义一些自定义错误信息的信息。此节点有Mode和defaultRedirect两个属性&#xff0c;其中defaultRedirect属性是一个可选属性&#xff0c;表示应用程序发生错误时重定向到的默认URL&#xff0c;如果…

肯德基收银系统模式_肯德基的完整形式是什么?

肯德基收银系统模式肯德基&#xff1a;肯塔基炸鸡 (KFC: Kentucky Fried Chicken) KFC is an abbreviation of "Kentucky Fried Chicken". It is a fast-food restaurant chain whose specialty is known for fried chicken because of its specialization in it. It…

泛型(CSDN转载)

函数的参数不同叫多态&#xff0c;函数的参数类型可以不确定吗&#xff1f; 函数的返回值只能是一个吗&#xff1f;函数的返回值可以不确定吗&#xff1f; 泛型是一种特殊的类型&#xff0c;它把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候进行。 下面是两个经典…

《MySQL tips:隐式类型转换与隐式字符编码转换对查询效率的影响》

维护一个交易系统&#xff0c;交易记录表tradelog包含交易流水号(tradeid)、交易员id(operator)、交易时间(t_modified)等字段。 create table tradelog (id int(11) not null,tradeid varchar(32) default null,operator int(11) default null,t_modified datetime default n…

HDU4291 A Short problem

求通项和斐波那契数列的方法一样&#xff0c;矩阵快速幂。 这道题麻烦在套了三层。 但其实取模这种操作肯定会出现循环的&#xff0c;可以先本地暴出循环节&#xff0c;1000000007对应的循环节是222222224&#xff0c;222222224对应的循环节是183120。 最外层的结果是对1000000…

pvr波形是什么意思_PVR的完整形式是什么?

pvr波形是什么意思PVR&#xff1a;Priya村路演 (PVR: Priya Village Roadshow) PVR is an abbreviation of Priya Village Roadshow. It is one of the biggest and leading multiplex cinema chains in India. PVR是Priya Village Roadshow的缩写 。 它是印度最大和领先的多元…

《MySQL——查询长时间不返回的三种原因与查询慢的原因》

目录查询长时间不返回等MDL锁等flush等行锁查询慢构造一张表&#xff0c;表有两个字段id和c&#xff0c;再里面插入了10万行记录 create table t (id int(11) not null,c int(11) default null,primary key (id) ) engine InnoDB;delimiter ;; create procedure idata() begi…

Linux 命令积累 fuser lsof mtr

fuser 用途:使用文件或文件结构识别进程,即:查询都有哪些进程占用了制定的文件、目录、设备或套接字;lsof MTR fuser命令 用途:使用文件或文件结构识别进程,即:查询都有哪些进程占用了制定的文件、目录、设备或套接字;语法:fuser [-c|-d|-f] [-k] [-u] [-x] [-V] 文件/目录…

线程终止问题

http://topic.csdn.net/u/20080429/09/9cfe5204-20b5-40fb-ac12-afdc1e4939e9.html?590511460 线程终止问题 http://blog.csdn.net/wuyazhe/article/details/1771470 带有消息机制的线程 - CustomMessageQueue(c#) using System; using System.Collections.Generic; using Sy…

HTH的完整形式是什么?

HTH&#xff1a;希望这个(那个)有帮助 (HTH: Hope This (That) Helps) HTH is an abbreviation of "Hope This (That) Helps". HTH是“希望有帮助”的缩写 。 It is an expression, which is commonly used in messaging or chatting on social media networking si…

排序算法复习—希尔排序

希尔排序&#xff0c;也称递减增量排序算法&#xff0c;是插入排序的一种更高效的改进版本。 希尔排序将整个待排元素序列分割成若干个子序列&#xff08;由相隔某个“增量”的元素组成的&#xff09;分别进行直接插入排序&#xff0c;过程中较小的元素&#xff0c;跳跃式的往前…

《MySQL——幻读与next-key lock与间隙锁带来的死锁》

create table t (id int(11) not null,c int(11) default null,d int(11) default null,primary key (id),key c (c) ) engine InnoDB;insert into t values(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25);该表除了主键id&#xff0c;还有索引c。 问下面的语句…

css 阴影 效果_CSS阴影效果

css 阴影 效果CSS中的阴影效果 (Shadow Effects in CSS) It is always good to make our web pages stylish and beautiful, web pages that would catch users eyes instantly but one gets confused as to how to style his or her web page. The confusion is quite legit t…

java常见的ClassNotFoundException-----菜鸟学习java

java常见的ClassNotFoundException 1 - java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory 添加包common-logging.jar2 - java.lang.ClassNotFoundException: javax.transaction.Synchronization 添加包jta.jar(hiberante)3 - java.lang.ClassNo…

关于easyui的一些小知识点(1)

让layout布局自动适应浏览器宽度只需要加上fit"true"属性。转载于:https://www.cnblogs.com/haifg/p/3613789.html