高性能MYSQL——6章查询执行的基础(1)

MySQL数据库基础知识7,查询的执行过程 MySQL进阶实战系列,打造精品专栏。 阅读详情

排序优化
mysql 排序很消耗性能。

  1. 排序时会对每一个排序记录分配一个足够长的定长空间来存放,vachar 分配 3个字节
  2. 除非查询的所有列都来自一个表,否则都会使用到临时表。
    5.6以后,mysql进行了很多改进,当只需返回部分排序结果的时候,例如有limit,mysql不再对所有结果排序,而是根据实际情况,抛弃不满足条件的结果。

关联子查询优化

SELECT * FROM sakila.film WHERE film_id IN (
    SELECT film_id FROM sakila.flim_act WHERE actor_id =1
);

MYSQL 会将其优化为关联查询 而不是 IN(1,23,344,5)

SELECT * FROM sakila.film WHERE EXISTS (
    SELECT * FROM sakila.film_actor WHERE actor_id =1 
    AND film_actor.film_id = film.film_id
)

首先mysql会对film表进行全表扫描,然后根据返回的film_id 逐个执行子查询,如果外层是一个很大的表,逐个查询性能会非常糟糕。

可以优化为:

SELECT film.* FROM sskila.film 
    INNER JONIN sakila.film_actor USING(film_id)
WHERE actor_id =1;

或者内层使用 GROUP_CONCAT() 查询出所有的ID,然后外层用IN来查询。

子查询也可能QTS比关联查询效率高:例如当返回结果中只有一个表中的某些列的时候~~~额……感觉这种情况还是比较少见,而且效率就是低也不会低很多。。。。。。具体还是具体分析。

UNION的限制:

(SELECT  * FROM skila.actor 
    ORDER BY last_name)
    UNION ALL
(SELECT  * FROM skila.customer 
    ORDER BY last_name)
    LIMIT 20;

可以分别在两条语句中分别加一个limit 20。来限制取出来的数据,然后再合并再取出20条。


等值传递
----

并行执行:mysql无法利用多喝特性来并行执行查询。

哈希关联
----

:不支持
松散索引扫描:mysql不支持松散索引扫描,也就是无法安装不连续的方式扫描一个索引。(这个不是特别明白。明天再研究研究。)
    select ... FROM tb WHERE b BETWEEN 2 AND 3;

最大值和最小值。
--------

    first_name 无索引:
    SELECT MIN(actor_id) FROM sakila.actor WHERE first_name ="PENELOPE";

    优化为:===>>>

    SELECT actor_id FROM sakila.actor USE INDEX(PRIMARY) WHERE first_name ='PENELOPE' LIMIT 1;

首先,first_name 没有索引,如果没有 USE INDEX 的话应该查到的是随机的一个值吧? 使用了索引,可以尽量少查记录数。同时获取到最小值()

各个数据库的无order by时的默认排序(代验证)


这是不靠谱的。潜规则。
===========

Oracle:
oracle对无order by的语句返回的结果不进行排序,oracle此时的处理方式是按照数据的物理存储顺序来读取数据。因为rowid是每行数据的地址,所以有时候看起来会像是使用rowid排序的。但这个顺序是可能被打乱的,在表的数据被删除后,rowid会被新插入的数据占用。所以一个无order by查询结果看起来也可能是个杂乱无章的。oracle的数据库实现就一个原则,怎么快怎么效率高就怎么来。大多数情况下不需要排序还非得按主键排序这不是浪费资源么?这和oracle的表结构是有关系的,因为oracle的表结构默认是按堆存放的。按堆存放的意思就是,随便存,存的时候就是乱序的。如果你建表的时候就是建的按索引组织的表,那么它返回的时候就会默认排序了。

sqlserver:
在不指定Order by的情况下,sqlserver会根据执行计划实际查询方式来得到数据,而执行计划会根据sql中很多的因素(的查询列,where条件,order by等)而使用不同的索引,最终出来的结果很可能是不同的。

MySQL:
对于 MyISAM 表 ,Select 默认排序是按照物理存储顺序显示的。
而InnoDB 表,会按主键的顺序排列。

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


DB2:
DB2的尚不清晰,排序好像与sort heap相关。

在同一个表中执行更新

UPDATE tb1 AS T1    
INNER JOIN (
     SELECT count(*) AS cnt 
     FROM tb1 
    GROUP BY type
)AS T2 USING(id)
SET T1.cnt = T2.cnt

查询优化器 hint

HIGHT_PRIRITY 和 LOW_PRIORITY 设置优先级
DELAYED 对INSERT 和 REPLACE 有效,主要试用与日志系统。可以将要插入的数据放入缓冲区,然后一次性批量插入。 PS( LAST_INSERT_ID 失效。不是所有的存储引擎都支持)

STRAIGHT_JOIN 修改关联查询中的主驱动表。

SQL_SMALL_RESULT SQL_BIG_RESULT 在group by 和 distinct 时会用到,用于数据排序在内存中排序还是在文件系统中排序

SQL_CACHE SQL_NO_CACHE

优化特定类型的查询

count
①count(*) 效率高于 count(name)
②count(NULL) 空的话不会计算
eg:
SELECT COUNT(color=’blue’ OR color=’red’) from item;
===>
SELECT sum(IF color =’blue’, 1, 0) AS blue, SUM( IF color=’red’, 1, 0) AS red from item;
===>
SELCT COUNT(color = ‘blue’ OR NULL) AS blue,COUNT(color = ‘red’ OR NULL) AS red FROM item

优化GROUP BY 和 DISTINCT
①尽量使用索引覆盖来查询,group by 和distinct 的字段在在一个表里面、
②sql_model 模式严格模式来写

WITH ROLLUP
普通的 GROUP BY 操作,可以按照部门和职位进行分组,计算每个部门,每个职位的工资平均值:

如果我们希望再显示部门的平均值和全部雇员的平均值,普通的 GROUP BY 语句是不能实现的,需要另外执行一个查询操作,或者通过程序来计算。如果使用有 WITH ROLLUP 子句的 GROUP BY 语句,则可以轻松实现这个要求:

+------+------+-----------+  
| dep | pos | avg(sal) |  
+------+------+-----------+  
| 01 | 01 | 1500.0000 |  
| 01 | 02 | 1950.0000 |  
| 01 | NULL | 1725.0000 |  
| 02 | 01 | 1500.0000 |  
| 02 | 02 | 2450.0000 |  
| 02 | NULL | 2133.3333 |  
| 03 | 01 | 2500.0000 |  
| 03 | 02 | 2550.0000 |  
| 03 | NULL | 2533.3333 |  
| NULL | NULL | 2090.0000 |  
+------+------+-----------+  
10 rows in set (0.00 sec)

优化LIMIT
①使用索引覆盖,延迟加载
SELECT * FROM sakila.film
INNER JOIN (
SELECT film_id FROM sakila.fim
ORDER BY title LIMIT 50,5
)AS lim USING (film_id)

②使用索引时:从书签记录页开始计算,防止limit,offset 取消掉大量数据
SELECT * FROM sakila.rental WHERE rental_id < 1630 ORDER BY rental_id DESC LIMIT 20;

SQL_CALC_FOUND_ROWS
使用方法

mysql> select SQL_CALC_FOUND_ROWS * FROM tbl_name -> WHERE id > 100 LIMIT 10; 
mysql> select FOUND_ROWS(); 

第二句会返回无limit的行数。看了很多文章的意思是 用count(*) 的效率比这种方式效率高。
使用SQL_CALC_FOUND_ROWS 会扫描所有的符合条件的字段;LIMIT 扫描到满足条件的行数不再扫描。

总结就是用上面的这个方式,用主键来做书签limit

UNION 优化
除非确实需要服务器消除重复的行。否则,一定要用UNION ALL 。
如果没有ALL 关键字,Mysql会给临时表加上 DISTINCT选项,这样做代价很大。即使有ALL Mysql,依然会使用临时表存储结果,先放入临时表,然后再从临时表中取出。再返回给客户端。这样代码会很大。

【MySQL】:查询,索引及优化,高性能存储myCat 文章目录慢查询慢查询配置慢查询解读慢查询工具mysqldumpslowpt_query_digest索引聚簇索引跟非聚簇索引聚簇索引非聚簇索引:覆盖索引(Covering Index)总结:重点执行计划执行计划详解重点 MySQL优化参考 慢查询 慢查询:顾名思义,就是查询慢的日志,是指mysql记录所有执行超过long_query_time参数设定的时间阈值的SQL语句的日志。该日志能为SQL... 阅读详情

相关推荐

Qt 文件对话框(QFileDialog)实战指南 —— 从基础到高级应用

本文是Qt文件对话框(QFileDialog)的实战指南,从基础静态函数调用到高级对象模式应用,全面解析了文件选择、保存、目录选取及多选等核心功能。文章深入探讨了MIME类型过滤、自定义侧边栏、信号槽实时响应及状态持久化等高级技巧,并提供了跨平台开发中的避坑指南与最佳实践,帮助开发者高效、稳健地集成文件操作功能。

weixin_29306261的博客 376

高性能mysql笔记(八)查询执行基础

msql执行查询的步骤:客户端/服务端通信协议他们之间的通信协议是“半双工”的,这就意味着在任意的时刻,要么是服务端向客户端发数据,要么是客户端向服务端发数据。这两个动作不能同时发生。 查询状态 show full processlist 1.sleep 线程等待客户端发送请求 2.query 线程正在执行查询,或者正在发送结果。 3.locked 线程正在等待锁 4.Analyz

国苏 387

篮球比赛24秒计时器改造指南:用Multisim实现可调式倒计时系统

本文详细介绍了如何使用Multisim软件改造篮球比赛24秒计时器,实现可调式倒计时系统。从脉冲信号发生器到声光报警模块,提供了完整的电路设计方案和调试技巧,帮助开发者快速掌握数字电路设计的核心原理,提升体育电子设备开发效率。

wood5的博客 211

mysql通过“延迟关联”进行limit分页查询优化的一个实例

最近在生产上遇见一个分页查询特别慢的问题,数据量大概有200万的样子,翻到最后一页性能很低,差不多得有4秒的样子才能出来整个页面,需要进行查询优化。 第一步,找到执行慢的sql,如下: SELECT shotel_id as hotelId, mroom_type_id as mroomTypeId, available_date as availableDate...

iteye_1914的博客 641

【STM32CubeIDE入门】(一)工程创建&工程配置

​写在前面:如果是刚接触stm32cubeide的同学推荐与这一篇文章共同阅读,能够更加快速认识上手stm32cubeide。 1、打开stm32cubeide,选择好工作目录进入主界面后,点击创建工程。

涛涛子的博客 1万+

RK3588平台-ES8388音频驱动调试与设备树配置实战

本文详细解析了在RK3588平台上调试ES8388音频驱动的实战过程。内容涵盖Linux音频驱动的三层架构(Machine、Platform、Codec),并重点提供了设备树(DTS)的完整配置示例,包括I2C节点、声卡节点及音频路由设置。文章还分享了驱动加载验证、amixer调试命令以及常见问题(如无声、变调)的排查思路,旨在帮助开发者快速完成RK3588与ES8388的音频系统集成。

mango的博客 806

【学习笔记】mysql查询执行的基础

本文属于读书笔记,大部分内容摘抄于《高性能MYSQL》,摘抄内容版权属于原作者。 mysql执行一个查询的过程,到底做了什么?   1. 客户端发哦送一条查询给服务器。 2. 服务器先检查查询缓存,如果命中缓存,则理科返回存储在缓存中的记过。否则进入下一阶段。 3. 服务器进行SQL解析,预处理,再由优化器生成对应的执行计划。 4. MY

猫球球的博客 1122

西电计科数据库系统期末复习笔记

本人西电19计科,数据库系统98,这是复习期间整理的笔记,基本涵盖了课程全部重点,有需要的学弟学妹可以在复习的时候参考一下。

Polaris的博客 8593

mysql中的性能优化问题

count(*) 当需要统计结果的行数时,尽量用count(*),而不是使用count(某一列)。当存在where条件时,需要先扫描条件中指定的数据,如果子条件中的数据过多,在统计行数时,可以使用相反的where条件,再用总数减去相反条件下的行数即可。 优化limit分页 如果要使用limit 1000, 20, 需要查询1020条记录,最后只返回后20条记录,前面查询到的1000条记录...

hello world! 332

Tiff、jpg图片怎么样添加地理坐标信息

Tiff、jpg图片怎么样添加地理坐标信息 一般,外业调查只有地图资料,如专题图、或者地形图,如何把这些地图资料的扫描地图带上坐标信息,从而内业实现信息化处理?以上问题,可以解决,但根据不同情况有不同的处理方法。     第一种,上面有经纬度外框,图片是矩形,但是没有地理信息。 通过图框的两个角的坐标确定范围,分别是左上(140°E,30°N);右下(150°W,30°N) 解决方

树木_xzw的博客 2万+

TPM 2.0实例探索2 —— LUKS磁盘加密(1)

本文对LUKS行了系统介绍

phmatthaus的专栏 1699

数据库优化之SQL查询优化

SQL查询优化: 1 MySQL查询路径 MySQL查询路径如下图所示: [img]http://dl2.iteye.com/upload/attachment/0104/4499/a310e182-2678-3115-b630-1eabf074760e.png[/img] 查询的生命周期大致包括:从客户端 到服务器,然后在服务器上进行解析,生成执行计划,执行...

笑傲江湖 215

Python爬虫实战:实时爬取东方财富网股票行情

东方财富网实时行情(价格、涨跌幅、成交量等)K线图、分时图、技术指标市盈率、换手率、总市值等指标相比某些收费API,东方财富网页端接口不需要登录、免费、响应快、封装清晰,适合爬虫实践。东方财富网股票数据接口分析实时数据抓取与字段提取数据结构化处理自动化批量抓取多线程加速采集数据可视化展示支持存储为CSV/Excel/数据库。

2201_76125261的博客 1万+

MySQL 查询执行的过程

查询的生命周期大致可以按照顺序来看:从客户端到服务端,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端。其中 “执行” 可以认为是整个生命周期中最重要的阶段,其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序分组等。当希望 MySQL 能够以高性能的方式运行查询时,最好的办法就是弄清楚 MySQL 是如何优化和执行查询的。MySQL 执行一个查询的过程,如下: 开始执行这条sql时,首先会校验你的用户名和密码是否正确,若是不正确会返回错误信息:"Access deni

程序猿进阶 4468

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

第8章-2 查询执行的基础

MySQL 主要分为 Server 层和引擎层,Server 层主要包括连接器、查询缓存、分析器、优化器、执行器,同时还有一个日志模块(binlog),这个日志模块所有执行引擎都可以共用,redolog 只有 InnoDB 有。         查询语句的执行流程如下:权限校验(如果命中缓存)--->查询缓存(mysql8.0后就废弃了)--->分析器--->优化器--->权限校验--->执行器--->引擎

一路向前 661

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

高性能 MySQL(十):执行一个查询的过程

当希望 MySQL 能够以更高的性能运行查询时,最好的办法就是搞清楚 MySQL 是如何优化和执行查询的。一旦理解这一点,很多查询优化工作实际上就是遵循一些原则,让优化器按照预想的方式运行。

水滴的博客 1656

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【mysql技术内幕1】mysql基础架构-一条SQL查询语句是如何执行的

1 一条SQL查询语句是如何执行的 ​ 通常我们使用数据库,都是将数据库看成一个整体,我们的应用与数据库完全就是通过SQL语句进行交互。大多数开发者很少去了解数据库的内部实现原理,这样也可以完成我们的应用。但是如果遇到一些疑难问题,如查询变慢、死锁、数据库宕机需要恢复数据时,我们就需要对数据库的实现原理有一定的了解,才能解决这些问题。了解一个东西,先鸟瞰其全貌,再一步步深入到内部。 ​ 想要了解mysql的基础架构,从最简单的SQL查询语句来分析,当了解了mysql是如何执行一条SQL查询语句后,就基本了解

厚积薄发 1931

《高性能MySQL》读书笔记(1~6章)

第1章 MySQL架构与历史 MySQL最重要、最与众不同的特性是它的存储引擎架构,这种架构的设计将查询处理(Query Processing)及其他系统任务(Server Task)和数据的存储/提取相分离。这种处理和存储分离的设计可以在使用时根据性能、特性,以及其他需求来选择数据存储的方式。 1.1 MySQL逻辑架构 顶层服务层并非MySQL独有,大多数基于网络对外提供服务的中间件都有这一层,主要是连接处理、授权认证、安全等。 第二层是MySQL的服务器层,大多数核心服务功能都在这一层,包括解析、

qq_40586164的博客 3670

高性能mysql笔记6_高性能MySQL笔记 第6章 查询性能优化

6.1 为什么查询速度会慢查询的生命周期大致可按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端。其中“执行”可以认为是整个生命周期中最重要的阶段。这其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序、分组等。在完成这些任务时,查询需要在不同的地方花费时间,包括网络、CPU计算、生成统计信息和执行计划、锁等待等操作,尤其是向底层存...

weixin_39576336的博客 171

高性能MySQL之Count统计查询

 近一段时间,有同事问我 “MySQL执行count很慢,有没有什么优化的空间”。当时在忙,就回复了一句“innodb里面count统计都是实时统计,慢一些是正常的”, 周末闲暇下来,想到以前有好多人都问过关于count的问题,今天就聊聊MySQL之Count查询。         关于MySQL的count查询,很多人都会有疑问,同样在大表中执行 ,有些速度基本不耗时,有些又慢的要死。关于这些...

斜阳雨陌 2万+

《高性能MySQL》夯实之路(四) 查询性能优化

优化排名语句给自定义变量赋值的同时可以使用Eg:;select @rownum = @rownum +1 limit 3,返回结果就会为1 ,2,3可以与ORDER BY组合使用来进行排名避免重复查询刚刚更新的数据统计更新和插入的数量可以返回插入INSERT时,因为冲突而改写为更新UPDATE的操作数量确定取值的顺序编写偷懒的UNION。

weixin_46644228的博客 1461

高性能MySQL-查询性能优化

如有侵权,请联系~如有错误,也欢迎批评指正~本篇文章大部分是来自学习《高性能MySQL》的笔记。

m0_50149847的博客 1373

MySQL如何执行查询语句

1. 前言 以下对MySQL执行查询语句的主要步骤进行分析,未涉及连接优化、排序优化等内容。 2. MySQL服务器架构 在了解MySQL如何执行查询语句前,首先需要了解MySQL服务器(MySQL Server)架构。 MySQL服务器架构示意图如下所示: 图片来源: https://www.oracle.com/technetwork/articles/javase/figure2-large-145676.jpg 。 图片来源: 《High Performance MySQL, 3rd Editio

adrninistrat0r的博客 953

【高性能MySQL】第6章 读书笔记

第6章 查询性能优化 6.1 为什么查询速度会慢 6.2慢查询基础:优化数据访问 6.2.1 是否向数据库请求了不需要的数据 6.2.2 MySQL 是否在扫描额外的记录 6.3 重构查询方式 6.3.1 一个复杂的查询还是多个简单的查询 6.3.2 切分查询 6.3.3 分解关联查询 分解关联查询的优势: 让缓存效率更高。 减少锁竞争。 可以更容易对数据库进行拆分,更容易做到高性能和可拓展。 更高效。 可以减少冗余记录的查询。 某些哈希关联的效率高很多。 6.4 查询执行的基础 6.4.1 MySQL

qq_45050687的博客 246

高性能mysql读书笔记三性能查询优化

本片博文是笔者学习《高性能mysql》一书的第二篇学习笔记,对应书籍章节为第五种,也是笔者《mysq》l学习专栏的的第三篇博文。主要针对mysql的sql执行生命周期,mysql循环嵌套查找、mysql优化、mysql的不足以及mysql的hint等方面进行学习。希望读者可以通过这篇博文对学习mysql有所收获。也欢迎大家订阅笔者《mysql》专栏,不定时更新mysql的知识。

liushangzaibeijing的博客 3万+

《高性能MySQL》第6章 查询性能优化

6.2 慢查询基础:优化数据访问 6.2.1 是否向数据库请求了不需要的数据 有些查询会请求超过实际需要的数据,然后这些多余的数据会被应用程序丢弃。这会给MySQL服务器带来额外的负担,并增加网络开销,另外也会消耗应用服务器的CPU和内存资源。 查询不需要的记录 最简单有效的解决方法就是在这样的查询后面加上LIMIT 总是取出全部列 每次看到SELECT * 的时候都需要用怀疑的眼光审视,是不是真的需要返回全部的列?很可能不是必需的。取出全部列,会让优化器无法完成索引覆盖扫描这类优化,还会为服务器带来额

mingrizhixin的博客 196
上一篇: PHPSTROM 添加外部库和引入其他文件夹
下一篇: php中函数前加&符号的作用
o王o
博客等级 码龄13年 32粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值