首页 > 数据库 >Mysql查询性能优化相关

Mysql查询性能优化相关

时间:2023-08-29 13:00:36浏览次数:49  
标签:缓存 查询 索引 Mysql 优化 id film

慢查询

基本原因

访问的数据太多

分析

  1. 是否检索了过多的数据。
  2. mysql服务器是否在分析大量超过需要的数据。

注意事项

  • 尽量不用select *
  • 分页查询(mysql从设计上让连接和断开连接都是很轻量级的。运行多个小查询不是大问题)
    • 缓存效率高
    • 减少锁竞争

查询的执行基础

查询执行路径(面试考)

                

  1. 客户端发送一条查询给服务器
  2. 服务器先检查缓存,命中缓存,则返回结果。否则继续往下执行
  3. 服务器SQL解析预处理
  4. 优化器生成执行计划
  5. 根据执行计划,调用存储引擎来执行查询。
  6. 返回客户端。

缓存

查询和缓存中的查询要一致,才能命中缓存。

返回前还需再确认一次用户权限。

解析器

判断语法规则,解析查询,判断关键字是否正确。

预处理

根据一些mysql规则,判断解析树是否合法。

优化器

由优化器将查询转为执行计划。选一个最好的执行计划进行执行。

  • 关联表的顺序
  • 外连接转内连接,可能
  • 等价变换 5=5 and a>5 优化成 a>5
  • min,max,会从b树两端取值
  • 覆盖索引:当索引中的列包含查询需要使用的列,mysql直接使用索引返回需要的数据,无需返回对应的数据行
  • 子查询优化
  • 提前终止查询
  • 等值传播

 Explain

 

 

 开发时优化特定的查询

 与特定的版本有关

优化count查询

 count()真正的作用:统计某个列值的数量;也可以统计行数。

统计行数的时候直接count(*) 比某个字段效果更好。意义也清晰。

 

MyISAM中,没有where条件的count(*)才快,因为有变量存。

 

优化关联查询

  •  ON或者Using列上有索引
    • 索引在第二个表加。例如关联顺序是BA,则在A表加索引。
  • 确保group by 和 order by 表达式值涉及到一个表中的列,这样才可能用索引。

优化子查询

尽可能使用关联查询代替。

 

优化GROUP BY 和 DISTINCT

group by 不能用索引时, 采用临时表 或者 文件排序做分组。

 

优化Limit分页(面试时考了N次) 

 limit在偏移量非常大的时候, limit 1000,20 这时查询1020条数据,返回最后的20条。

前面1000条被抛弃。这样代价很高。

 

优化方法是:

1.尽可能地只用索引覆盖,而不是查询所有列。然后根据需求做一次关联操作,返回需要的列。

例如

select film_id, description FROM sakila.film ORDER BY title LIMIT 50,5。

-- 可以改成

select film.film_id, film.description

from sakila.film

 inner join (

  select film_id FROM sakila.film ORDER BY title LIMIT 50,5。 

)as lim using(film_id); 

 

2.将limit查询转换为已知位置的查询,让Mysql是通过范围查询获得到对应的结果。

 where position BETWEEN 50 and 54 ORDER BY position;

 

3.加区间

比如主键查询16049到16030的记录。

可以查询where id > 16030 .

这样无论多少页,性能都会很好。

 

《高性能Mysql》

标签:缓存,查询,索引,Mysql,优化,id,film
From: https://www.cnblogs.com/jiangym/p/17596603.html

相关文章

  • redis高级用法:慢查询、pipline与事务、发布订阅、bitmap位图、HyperLogLog、GEO地理位
    目录一高级用法之慢查询1.1生命周期1.2两个配置1.2.1slowlog-max-len1.2.2slowlog-max-len1.3设置慢查询1.5作用二pipline与事务2.1什么是pipeline(管道)2.2python客户端实现pipline2.3与原生操作对比2.4使用建议2.5原生redis操作操作事务三发布订阅3.1角色3.2模......
  • SQL Server优化-CPU居高不下
    1.查看链接对象USEmaster2GO3--如果要指定数据库就把注释去掉4SELECT*FROMsys.[sysprocesses]WHERE[spid]>50--ANDDB_NAME([dbid])='gposdb'2、然后使用下面语句看一下各项指标是否正常,是否有阻塞,正常情况下搜索结果应该为空。SELECTTOP10[session_id],[r......
  • SQL Server 根据表名查询包含的列名、类型、长度等
      select c.nameas'列名', casewhenc.is_identity=1then'√'else'×'endas'自增', ty.nameas'数据类型', c.max_lengthas'长度', casewhenc.is_nullable=1then'√'else'×&......
  • 百亿数据查询秒级响应,观测体系之日志中心该如何玩转?
    日志是处理生产故障、性能优化、业务分析的重要参考依据,是系统稳定运行不可或缺的一部分。随着业务系统规模急剧膨胀增大,尤其是是微服务架构逐渐普及,一个系统可能涉及多个应用模块与服务实例,传统模式下运维人员去定位问题显得异常困难,效率低下。当服务器资源增加时,各种类型的系统日......
  • 深入理解数据库连接池及其在后端性能优化中的作用
    在后端开发中,数据库连接池是一个至关重要的概念,它在保障系统性能、资源利用以及稳定性方面起着重要作用。本篇博客将深入探讨数据库连接池的工作原理,以及在Java应用中如何合理地配置和使用连接池来优化后端性能。什么是数据库连接池?数据库连接池是一个管理数据库连接的技术,它在应用......
  • mysql索引失效的几种情况
    1.在索引字段上使用函数2.在索引字段上使用运算3.索引字段使用了类型转换,即原本是字符串类型,查询时用的数字类型4.范围条件右边的列索引失效,比如>,<,between等,in不属于范围条件5.!=或者<>索引失效6.isnu11可以使用索引,isnotnu11无法使用索引7.like以通配符号开头索引......
  • Oracle 字符串相似度查询
    Oracle函数: SYS.UTL_MATCH.EDIT_DISTANCE_SIMILARITY(str,patternStr)--Oracle查询字符串相似度函数SELECTDISTINCTe.EQP_GROUP,SYS.UTL_MATCH.EDIT_DISTANCE_SIMILARITY(e.EQP_GROUP,'LARF')xsdFROMIMP_AREA_EQPGROUP_MAPPINGeORDERBYXSDDESC查询结果: ......
  • Kafka - 为什么 Kafka 不像 MySQL 那样允许追随者副本对外提供读服务?
    几个原因:1,kafka的分区已经让读是从多个broker读从而负载均衡,不是MySQL的主从,压力都在主上;2,kafka保存的数据和数据库的性质有实质的区别就是数据具有消费的概念,是流数据,kafka是消息队列,所以消费需要位移,而数据库是实体数据不存在这个概念,如果从kafka的follower读,消费端offset控制......
  • MySq之一条mysql语句来更新(插入)查询结果
    想起之前没问人家自己那213的做法,想起来都想怎么笑(记录之前困惑的问题解决了的)非常的简单要插入teble1表中的id>100的字段name,address 到table2表insertintotable2(name,address)(selectname,addressfromtable1whereid>100)要查询teble1表中的name=阿呜......
  • MySql之 replace 用法
    mysqlreplace实例说明: UPDATEtb1SETf1=REPLACE(f1,'abc','def'); REPLACE(str,from_str,to_str) 在字符串str中所有出现的字符串from_str均被to_str替换,然后返回这个字符串 这个函数用来批量替换数据中的非法关键字是很有用的!如下例子: 例1:UPDATEBBSTo......