mysql范围查找性能_MYSQL(四)查询性能优化
优化数据访问
1.是否向数据库请求了不需要的数据
解决方式:
A. 查询后加limit
B. Select后写需要的列而不是*
2. 是否扫描了额外的数据
数据库的访问方式速度由慢到快:全表扫描,索引扫描,范围扫描,唯一索引查询,常数引用
MYSQL Explain命令 的type(数据库引擎访问表的方式):Const > ref > range > index > all
1. const 常数引用
如果是根据主键查询,将会将查询转化为一个常数,只取出确定的一行数据。是最快的一种。
2. Ref
查找条件列使用了索引而且不为主键和unique(值允许重复),只取出确定值的数据,可能多行。
3. ref_eq 唯一索引查询
ref_eq 与 ref相比,这种类型的查找结果集只有一个
4. range 范围扫描
索引或主键,在某个范围内时
4. index 索引扫描
仅仅只有索引被扫描
5.all 全表扫描
一般mysql应用where条件的方式由好到坏:
1. 在索引中使用where条件过滤,这是在存储引擎层完成;
2. 使用索引覆盖扫描,直接从索引中过滤不需要的数据并返回结果,这是在mysql服务器层完成,无需再回表查询(在extra中出现using index)
3. 从数据表中返回数据,然后过滤不满足条件的数据,在服务器层完成,mysql需要先从数据表读出记录然后过滤(在extra中出现using where)
好的索引可以让查询使用合适的访问类型,减少扫描的数据行数。
执行查询的基础:
1. 客户端发送一条查询给服务器
2. 服务器先检查缓存,如果命中缓存,立刻返回结果
3. 服务器进行sql解析,预处理,再由优化器生成对应执行计划
4. Mysql根据优化器生成的执行计划,调用存储引擎API执行查询计划
5. 将结果返回给客户端
第一步(客户端发送一条查询给服务器):
Mysql客户端与服务器之间的通信是半双工的,要么由服务器向客户端发送数据,要么由客户端向服务器发送数据,不能同时进行;
所以为了进行流量控制,客户端发送查询语句过长时,超过max_allowed_packet参数,服务器会抛出相应错误。
客户端从服务器获取数据时,多数连接mysql的库函数都可以获得全部结果集并缓存到内存里,mysql需要等所有数据都发给客户端才能释放这条查询所占用的资源;
第三步(服务器进行sql解析、预处理、查询优化):
首先,通过关键字将sql语句进行解析,生成一颗“解析树”;
解析器验证语法规则;
预处理器检查解析树是否合法,验证权限;
查询优化器使用优化策略生成一个最优的执行计划:
1. 重新定义关联表的顺序
2. 将外连接转化为内连接
3. 优化count(),min(),max()(根据b-tree只读取第一条或最后一条数据)
4. 预估并转化为常数表达式
5. 提前终止查询
6. 列表in()的比较(将in列表的数据先排序,通过二分查找确定值是否满足条件)
生成一个执行计划——指令树:因为mysql的关联从一张表开始嵌套,所以执行计划是一颗左侧深度优先的树。
第四步(调用存储引擎API执行查询计划)
查询优化器在服务器层,而统计信息(每个表或索引有多少页,每个表的每个索引的基数是多少,数据行和索引长度,索引的分布信息等)在存储引擎层;
MYSQL执行关联查询方式:
Mysql认为任何一次查询都是一次关联,并不仅仅一次查询关系到两张表时。
在MySQL 中,只有一种 Join 算法,就是 Nested Loop Join嵌套迭代。
Simple Nested-Loop Join简单嵌套循环:从驱动表中取出R1匹配S表所有列,然后R2,R3,直到将R表中的所有数据匹配完,然后合并数据,可以看到这种算法要对S表进行RN次访问,虽然简单,但是相对来说开销还是太大了。
Index Nested-Loop Join索引嵌套循环:由于非驱动表上有索引,所以比较的时候不再需要一条条记录进行比较,而可以通过索引来减少比较,从而加速查询。
优化:
选择记录数少的作为驱动表;
优先优化NestedLoop的内层循环;
保证被驱动表上Join条件字段已经被索引
Mysql查询优化器的局限性
1.关联子查询
使用in加子查询,性能非常糟糕
//未完
2. 最大值和最小值
对于max()和min()查询,mysql的优化并不好,如:
Select min(actor_id) from sakila.actor where first_name = “pene”;
因为first_name字段上没有索引,所以mysql会进行一次全表扫描;
一个优化办法是:(使mysql进行主键扫描)
select actor_id from sakila.actor use index(primary) where first_name = “pene” limit 1;
用主建索引查询,因为b-tree是按照主键顺序排序,所以limit 1 = min(actor_id),查找索引直到复合where条件的第一条数据
mysql范围查找性能_MYSQL(四)查询性能优化相关推荐
- 读薄《高性能MySql》(四)查询性能优化
读薄<高性能MySql>(一)MySql基本知识 读薄<高性能MySql>(二)Scheme与数据优化 读薄<高性能MySql>(三)索引优化 读薄<高性能M ...
- mysql获取查询策略语句_MySQL数据库查询性能优化策略
优化查询 使用Explain语句分析查询语句 Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句. 通过对查询语句的分析,可以了解查询语句的执行 ...
- mysql text查找性能_MySQL TEXT字段性能
I now know that TEXT fields are written to disk rather than in memory when queried 仅当查询需要临时表来存储多个排序或 ...
- mysql 大分页查询优化_Mysql骚操作:优化大分页查询
背景 系统结构如上图.经过排查是因为系统B拉取数据时间太长导致的推送超时. 系统B拉取数据的方法是根据_tiemstamp(数据操作时间)分页查询系统A的接口,即: 1SELECT 字段名2FROM ...
- mysql分表全局查询_mysql如何查询多样同样的表/sql分表查询、java项目日志表分表的开发思路/按月分表...
之前开发的一个监控系统,数据库的日志表是单表,虽然现在数据还不大并且做了查询sql优化,不过以后数据库的日志表数据肯定会越来越庞大,将会导致查询缓慢,所以把日志表改成分表,日志表可以按时间做水平分表, ...
- mysql locate不走索引_MySQL 索引——定位并优化慢 SQL
定位并优化慢查询SQL.png 为什么要学习定位并优化慢查询 SQL 日常开发中,在数据量比较小的表中,SQL 的执行效率可能没什么问题,但是随着表数据量的增加,慢 SQL 可能就会慢慢浮现,因此学习 ...
- mysql 联合索引 性能_mysql:联合索引及优化
命名规则:表名_字段名 1.需要加索引的字段,要在where条件中 2.数据量少的字段不需要加索引 3.如果where条件中是OR关系,加索引不起作用 4.符合最左原则 尽量不要用or,如果可以用un ...
- mysql insert 性能_MySQL 提高Insert性能
插入一个记录需要的时间由下列因素组成,其中的数字表示大约比例: 连接:(3) 发送查询给服务器:(2) 分析查询:(2) 插入记录:(1x记录大小) 插入索引:(1x索引) 关闭:(1) 这不考虑打开 ...
- mysql查找 提速_MySQL加速查询速度的独门武器:查询缓存
[导读] 与朋友或同事谈到mysql查询缓存功能的时候,个人喜欢把Query Cache比作荔枝,是非常营养的东西,但是一次性吃太多了,就容易导致上火而流鼻血,虽然不是特别恰当的比喻,但是有很多相似的 ...
- mysql 替换 斜杠_Mysql like查询语句中,结果包含反斜杠 \ 字符的,需要替换成四个反斜杠 \\\\...
如题,当SQL语句中使用Like查询,且期望匹配的结果中含有"\"的,应当把"\"替换为"\\\\". 比如数据库中text字段有以下三行: ...
最新文章
- 直流电机基本系统模型
- python获取qq好友ip_qqzeng-ip.dat IP库读取python版
- linux服务器nvidia驱动的安装与卸载
- VC++ ToolTip的简单使用
- RabbitMQ实现RPC
- [CF.Skills]Windows Mobile如何编程实现免提功能
- Linux下搭建Java环境
- 关于Adobe软件安装失败的各类错误代码BUG汇总!!
- matlab猜数字游戏程序,matlab 猜数字小游戏
- 【JS】Unicode编码
- 计算机科学之父--图灵
- sqlmap用法详解
- Android手机存储路径
- YT8614 QSGMII 模式网口丢包问题分析
- js字符串转换成数字
- 奶牛问题3:奶牛派对
- [i:]和[i]发音
- PyTorch 中的 dropout Dropout2d Dropout3d
- PLC数据采集时的数据安全,以及PLC-Recorder对于数据的暂存和恢复功能
- 计算机专业就业正规军干不过游击队?
热门文章
- vagrant 安装使用 win7
- 24小时学通linux视频教程下载
- [转]sql update 触发器 获得被update的行的信息详解
- 【控制】传递函数的性质
- STM32 基础系列教程 40 - Lwip_mqtt
- 【PC工具】文件压缩解压工具winrar解压缩装机必备软件,winRAR5.70免费无广告
- 【DIY】热水器升级加装远程wifi控制功能,esp8266远程红外控制热水器启动,新增自动定时烧水断电需求整理...
- 美丽的童话故事都是从城堡开始...
- Altium.Designer的学习视频 分享~~
- 我の第一篇万字博文 | 带大家开开心心地进入Python世界