MySQL优化

MySQL 优化 基于规则优化 14 基于规则的优化 ​ MySQL会基于一些规则重写我们写的语句,使得查询的执行更加高效 表的结构 # 表single_table CREATE TABLE single_table ( id int not null auto_increment, key1 VARCHAR(100), key2 int, key3 varchar(100), key_part1 varchar(100), 阅读详情

mysql性能调优的思路

  1. 最好的优化—–不查询! 这不是开玩笑.
  2. 了解性能浪费比例: 业务逻辑过多的查询>表结构不合理>sql语句效率低>硬件
  3. 如果一台服务器出现长时间负载过高 /周期性负载过大,或偶尔卡住
    如何来处理?
    答: 大的思路:
    是周期性的变化还是偶尔问题?
    是服务器整体性能的问题, 还是某单条语句的问题?
    具体到单条语句, 这条语句是在等待上花的时间,还是查询上花的时间.
    唯一的办法—–监测并观察服务器的状态.
    1:观察服务器状态, 一般用如下2个命令
    Show status; Show processlist;
    例: mysql> show status;
    #mysqladmin ext

MySQL周期性波动解决办法:

  1. 减少无关请求(业务逻辑层面,暂不讨论,但其实是最有效的手段)
  2. 如果请求数是一定的,不可减少的. 我们要尽量让请求数平稳,不要有剧烈波动.
    很多时候,不是服务器撑不住总的查询量,而是在某个时间段撑不住高峰请求.
  3. 夜间负载低时,集中失效. 短时间内会有波峰,但夜间访问量少,因此波峰并不剧烈,当到上午10点左右人多时,缓存已经建立了一部分. 白天时,波峰也不剧烈.
  4. 或者让缓存的生命周期在一定范围内随机,也可以减缓波峰剧烈的情况

对于不规则的延迟现象的观察

不规则的延迟现象往往是由于效率低下的语句造成的,如何抓到这些效率低的语句.
可以用show processlist命令长期观察,或用慢查询.

如果观察到以下状态,则需要注意
converting HEAP to MyISAM
查询结果太大时,把结果放在磁盘 (语句写的不好,取数据太多)

create tmp table
创建临时表(如group时储存中间结果,说明索引建的不好)

Copying to tmp table on disk
把内存临时表复制到磁盘 (索引不好,表字段选的不好)

locked
被其他查询锁住 (一般在使用事务时易发生,互联网应用不常发生)

logging slow query
记录慢查询

临时表在如下几种情况被创建:

  • 如果group by 的列没有索引,必产生内部临时表,
  • 如果order by 与group by为不同列时,或多表联查时order by ,group by 包含的列不是第一张表的列,将会产生临时表(实验1)
  • distinct 与order by 一起使用可能会产生临时表(实验2)
  • union合并查询时会用到临时表

想确定查询是否需要临时表,可以用EXPLAIN查询计划,并查看Extra列,看是否有Using temporary.

通过前面实验,可以看出,数据库的优化是一个系统工程:

  1. 建表: 表结构的拆分,如核心字段都用int,char,enum等定长结构
    非核心字段,或用到text,超长的varchar,拆出来单放一张表.

  2. 建索引: 合理的索引可以减少内部临时表(索引优化策略里详解)

  3. 写语句: 不合理的语句将导致大量数据传输以及内部临时表的使用.

表的优化与列类型选择

表的优化:
  1. 定长与变长分离
    如 id int, 占4个字节, char(4) 占4个字符长度,也是定长, time
    即每一单元值占的字节是固定的.
    核心且常用字段,宜建成定长,放在一张表.
    而varchar, text,blob,这种变长字段,适合单放一张表, 用主键与核心表关联起来.
  2. 常用字段和不常用字段要分离.
    需要结合网站具体的业务来分析,分析字段的查询场景,查询频度低的字段,单拆出来.
  3. 合理添加冗余字段.
列选择原则:
  1. 字段类型优先级 整型 > date,time > enum,char>varchar > blob
  2. 够用就行,不要慷慨 (如smallint,varchar(N))
  3. 尽量避免用NULL()

索引优化策略

1:索引类型
1.1 B-tree索引
注: 名叫btree索引,大的方面看,都用的平衡树,但具体的实现上, 各引擎稍有不同,
比如,严格的说,NDB引擎,使用的是T-tree
Myisam,innodb中,默认用B-tree索引

但抽象一下—B-tree系统,可理解为”排好序的快速查找结构”.

1.2 hash索引
在memory表里,默认是hash索引, hash的理论查询时间复杂度为O(1)

疑问: 既然hash的查找如此高效,为什么不都用hash索引?
答:
1. hash函数计算后的结果,是随机的,如果是在磁盘上放置数据,
比主键为id为例, 那么随着id的增长, id对应的行,在磁盘上随机放置.
2. 不法对范围查询进行优化.
3. 无法利用前缀索引. 比如 在btree中, field列的值“hellopworld”,并加索引
查询 xx=helloword,自然可以利用索引, xx=hello,也可以利用索引. (左前缀索引)
因为hash(‘helloword’),和hash(‘hello’),两者的关系仍为随机
4. 排序也无法优化.
5. 必须回行.就是说 通过索引拿到数据位置,必须回到表中取数据

2: btree索引的常见误区
2.1 在where条件常用的列上都加上索引
例: where cat_id=3 and price>100 ; //查询第3个栏目,100元以上的商品
误: cat_id上,和, price上都加上索引.
错: 只能用上cat_id或Price索引,因为是独立的索引,同时只能用上1个.

2.2 在多列上建立索引后,查询哪个列,索引都将发挥作用
误: 多列索引上,索引发挥作用,需要满足左前缀要求.

聚簇索引与非聚簇索引

innodb和myisam的索引区别:

innodb的主索引文件上 直接存放该行数据,称为聚簇索引,次索引指向对主键的引用
myisam中, 主索引和次索引,都指向物理行(磁盘位置).

聚簇索引的优劣势

优势: 根据主键查询条目比较少时,不用回行(数据就在主键节点下)
劣势: 如果碰到不规则数据插入时,造成频繁的页分裂.

高性能索引策略

对于innodb而言,因为节点下有数据文件,因此节点的分裂将会比较慢.
对于innodb的主键,尽量用整型,而且是递增的整型.
如果是无规律的数据,将会产生的页的分裂,影响速度.

索引覆盖:

索引覆盖是指 如果查询的列恰好是索引的一部分,那么查询只需要在索引文件上进行,不需要回行到磁盘再找数据.
这种查询速度非常快,称为”索引覆盖”

理想的索引
  1. 查询频繁
  2. 区分度高
  3. 长度小
  4. 尽量能覆盖常用查询字段.
延迟关联
select a.* from it_area as a inner join (select id from it_area where name like '%东山%') as t on a.id=t.id;

第2种做法中, 内层查询,只沿着name索引层顺序走, name索引层包含了id值的.
所以,走完索引层之后,找到所有合适的id,
再通过join, 用id一次性查出所有列. 走完name列再取.

第1种做法: 沿着name的索引文件走, 走到满足的条件的索引,就取出其id,
并通过id去取数据, 边走边取.

通过id查找行的过程被延后了. — 这种技巧,称为”延迟关联”.

索引与排序

排序可能发生2种情况:
1: 对于覆盖索引,直接在索引上查询时,就是有顺序的, using index
2: 先取出数据,形成临时表做filesort(文件排序,但文件可能在磁盘上,也可能在内存中)

我们的争取目标—–取出来的数据本身就是有序的! 利用索引来排序.

sql语句优化

  1. sql语句的时间花在哪儿?
    答: 等待时间 , 执行时间.
    这两个时间并非孤立的, 如果单条语句执行的快了,对其他语句的锁定的也就少了.
    所以,我们来分析如何降低执行时间.

  2. sql语句的执行时间,又花在哪儿了?
    答:
    a: 查 —-> 沿着索引查,甚至全表扫描
    b: 取 —-> 查到行后,把数据取出来(sending data)

  3. sql语句的优化思路?

    • 不查, 通过业务逻辑来计算, 比如论坛的注册会员数,我们可以根据前3个月统计的每天注册数, 用程序来估算.

    • 少查, 尽量精准数据,少取行. 我们观察新闻网站,评论内容等,一般一次性取列表 10-30条左右.

    • 必须要查,尽量走在索引上查询行.

in 型子查询引出的陷阱

原因: mysql的查询优化器,针对In型做优化,被改成了exists的执行效果.
当goods表越大时, 查询速度越慢.

改进: 用连接查询来代替子查询

explain select goods_id,g.cat_id,g.goods_name from  goods as g inner join (select cat_id from ecs_category where parent_id=6) as t using(cat_id) \G
from 型子查询:

注意::内层from语句查到的临时表, 是没有索引的.
所以: from的返回内容要尽量少.

count() 优化

误区:
1. myisam的count()非常快
答: 是比较快,.但仅限于查询表的”所有行”比较快, 因为Myisam对行数进行了存储.
一旦有条件的查询, 速度就不再快了.尤其是where条件的列上没有索引.

  1. 假如,id<100的商家都是我们内部测试的,我们想查查真实的商家有多少?
select count(*) from lx_com where id>=100;  (1000多万行用了6.X秒)

小技巧:

select count(*) from lx_com; 快
select count(*) from lx_com where id<100; 快
select count(*) frol lx_com -select count(*) from lx_com where id<100; 快
select (select count(*) from lx_com) - (select count(*) from lx_com where id<100)
group by

注意:
1. 分组用于统计,而不用于筛选数据.
比如: 统计平均分,最高分,适合, 但用于筛选重复数据,则不适合.
以及用索引来避免临时表和文件排序
2. 以A,B表连接为例 ,主要查询A表的列,
那么 group by ,order by 的列尽量相同,而且列应该显示声明为A的列
3. union优化
注意: union all 不过滤 效率提高,如非必须,请用union all
因为 union去重的代价非常高, 放在程序里去重.

limit 及翻页优化

limit offset,N, 当offset非常大时, 效率极低,
原因是mysql并不是跳过offset行,然后单取N行,而是取offset+N行,返回放弃前offset行,返回N行.效率较低,当offset越大时,效率越低

优化办法:
1. 从业务上去解决
办法: 不允许翻过100页
以百度为例,一般翻页到70页左右.
2. 不用offset,用条件查询.

为什么用单表查询

  1. 单表查询的缓存命中比多表连接查询高
  2. 为了方便以后的分表分库
  3. 单表查询速度比多表连接查询快
嵌入式开发之瑞芯微RK356x--基本环境搭建 嵌入式环境搭建 阅读详情

相关推荐

T-Box功能详解及应用

T - BOX,其全称为 Telematics Box,作为远程 / 车载通信模块,是一款集车身网络与无线通讯功能于一体的智能终端设备。它充当了多媒体车机与 TSP(汽车远程服务提供商)以及互联网之间的无线路由器角色,为用户创造了远程访问的可能。用户借助T - BOX能够对车辆配备的各个 ECU(电子控制单元)进行远程操控,包括远程启动或停止发动机开启或关闭空调天窗后备箱门车门,以及实现闪灯鸣笛等功能。

wgl110110的博客 5643

大数据量分页优化

有如下表(innodb引擎), sql语句在笔记中, 给定日照市,查询子地区, 且查询子地区的功能非常频繁, 如何优化索引及语句? +------+-----------+------+ | id | name | pid | +------+-----------+------+ | .... | .... | .... | | 1584 | 日照市...

dianchamian8747的博客 141

非模式物种PySCENIC分析流程

外的物种想要做scenic分析的话, 可以使用同源基因转换后再进行分析, 将要分析的物种的gene Symbol转换为人、小鼠或者是果蝇的gene Symbol后进行分析。odiscus sinensis(中华鳖)的基因-细胞的矩阵,进行pyscenic分析的话,可参考以下示例。目前pyscenic分析支持的物种仅为人、小鼠和果蝇,其他物种暂时还没有相应的数据库,因。本教程基于Linux及服务。SCENIC转录因子分析。器中的Rstudio环境。例如我们有一个Pel。

weixin_47195452的博客 935

大数据量分页优化--延迟查询

延迟关联 select * from it_area where name like '%东山%';+------+-----------+------+ | id   | name      | pid  | +------+-----------+------+ |  757 | 东山区 |  751 | | 1322 | 东山县 | 1314 | | 2118 | 东山区 | 2

freedomai的专栏 1217

Camera | 瑞芯微rk3568平台MIPI-CSI驱动:从设备树到V4L2框架的完整链路解析

本文深入解析瑞芯微rk3568平台MIPI-CSI驱动的完整链路,从设备树配置到V4L2框架集成。详细介绍了rk3568的MIPI-CSI驱动架构、设备树关键节点布局、驱动初始化流程及数据流路径,帮助开发者快速掌握摄像头控制器的调试与优化技巧,实现稳定的视频采集系统。

weixin_28703489的博客 290

Allegro PCB设计实战:5分钟搞定DDR信号线的Match Group等长规则设置

本文详细介绍了在Allegro PCB设计中,如何快速为DDR信号线设置Match Group等长规则。通过实战演练,解析了从理解相对传输延迟原理、在规则管理器中创建Match Group,到设置合理容差和利用动态绕线指示的全流程,帮助工程师在5分钟内高效完成高速信号时序约束,提升设计可靠性与效率。

gg901的博客 1055

MySQL的优化

在应用的开发过程中,由于初期数据量小,开发人员写SQL语句更加重视功能上的实现,但是当应用系统正式上线后,随着数据量的急剧增长,很多SQL语句开始逐渐显露出性能问题,对生产的影响也越来越大,此时这些有问题的SQL语句就成为整个系统性能的瓶颈,因此我们必须要对它们进行优化.

weixin_71629261的博客 2282

【WebRTC】【Unity】Unity Web RTC1-Unity中简单实现远程画面

平台:基本常用平台包括安卓,苹果(max和IOS),Windows64,Linux都行。10. 注意,如果从移动设备浏览器连接服务,信令服务器的SSL证书一定要先设好。想要在Unity中实现实时远程桌面,找到了Render Streaming这个手段,本篇介绍相应的使用方法和实例。8. 打开电脑浏览器,地址栏输入http://127.0.0.1,点击Receiver Sample。新建Unity项目,模板选Third Person,Project Name随意。启动App,控制台出现如下信息表示成功。

每日出拳老爷子的博客 2518

MySQL 优化

调优思路 对查询进行缓存 强制限制 MySQL 资源设置 关键字缓冲区 调优思路 1. 硬件优化 2. 数据库设计与规划--以后再修改很麻烦,估计数据量,使用什么存储引擎 3. 数据的应用--怎样取数据,SQL语句的优化 4. 磁盘 IO优化 5. 操作系统的优化--内核、TCP连接数量 6. MySQL服务优化--内存的使用,磁盘的使用 7. my.cnf 内参数的优化 8. 分库分表思路和优劣 硬件优化 CPU—— 64 位、高主频、高缓存,高并行处理能力 内存——大内存、主频高,尽量不要用

1837

RT-Thread必考面试题及参考答案

RT-Thread的设备驱动模型遵循层次化的结构,设计简洁且易于扩展。它主要由设备注册、设备操作和设备控制三部分组成。设备驱动模型允许开发者为不同的硬件设备编写驱动程序,这些驱动程序可以被RT-Thread内核统一管理和调度。在RT-Thread中,设备被抽象成一系列标准的接口,包括打开、关闭、读取、写入、控制等操作,这些操作封装在结构体中。设备驱动程序需要实现这些接口,然后通过调用函数注册设备,使其对系统可见。这种模型不仅简化了驱动开发,还提高了代码的可移植性和可维护性。

大模型大数据攻城狮的专栏 1824

详解AUTOSAR:什么是AUTOSAR?(理论篇—1)

AUTOSAR是由全球各大汽车整车厂、汽车零部件供应商、汽车电子软件系统公司联合建立的一套标准协议,是对汽车技术开发一百多年来的经验总结。

不脱发的程序猿 1万+

MySQL8.0优化 - 优化MySQL服务器、优化MySQL的参数、优化数据类型

MySQL8.0优化 - 优化MySQL服务器、优化MySQL的参数、优化数据类型

小草的博客 5329

极智AI | 算能SC5+智算卡驱动安装与升级

大家好,我是极智视界,本文介绍一下 算能SC5+智算卡驱动安装与升级

极智视界 1277

MySQL 优化 —— IS NULL 优化

引言 本博客翻译自 MySQL 官网:IS NULL Optimization, MySQL版本 5.7。 MySQL 对 IS NULL 的优化 MySQL 可以对 IS NULL 执行和常量等值判断(列名= 常量表达式,如name = 'Tom')相同的优化。MySQL 可以利用索引和范围来搜索空值。 例如: SELECT * FROM tbl_name WHERE key_co...

Morty的技术乐园 8470

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Mysql 优化的几种方法

MySQL优化是指通过调整MySQL的各项参数和配置,以及优化SQL语句的编写和执行,提高MySQL系统的性能和可用性。MySQL优化的主要目标是尽可能快地响应用户请求,提高系统的处理能力和并发性能,减少资源消耗和硬件成本。MySQL优化涉及多个方面,包括:1.硬件配置:包括CPU、内存、磁盘等硬件资源的选择和配置,以满足系统的负载和性能需求。2.软件配置:包括MySQL的参数设置和调整,如缓存大小、连接数、并发处理数等,以适应不同的负载和访问模式。

兴趣是最好的老师,勤能补拙 7102

MySQL 优化方案

MySQL 查询过程是指从客户端发送 SQL 语句到 MySQL 服务器,再到服务器返回结果集的整个过程。这个过程涉及多个组件的协作,包括连接管理、查询解析、优化、执行和结果返回等。索引是提高查询性能的核心手段,但需要合理使用。查询缓存(MySQL 8.0 之前)优化查询语句本身可以显著提升性能。使用 LIMIT 时避免高偏移量。合理使用 IN 和 EXISTS。使用 EXPLAIN 分析查询。避免 SELECT *

qq_33807380的博客 1071

Mysql性能优化、Mysql参数优化、Mysql配置优化

Mysql性能优化、Mysql参数优化、Mysql配置优化Mysql参数优化对于不同的网站,及在线量等,以及机器硬件的配置都有关系,优化不可能一次性完成,需要不断的观察以及调试,才有可能的得到最佳的效果为了测试我们创建一个test1的库创建一个tb1的表,然后导入2万行数据,脚本如下:?1234567891011121314151617181920212223242526#!/bin/bash  ...

破茧 2488

全面优化MySQL

MySQL性能瓶颈原因 硬件、系统因素 CPU 磁盘I/O 网络性能 操作系统争用 MySQL相关因素 数据库设计 索引、数据类型 应用程序性能 特定请求、短时事务 配置变量 缓冲区、高速缓存、InnoDB 瓶颈分析工具 sysstat工具集...

aohexi1719的博客 159

MySQL索引优化

这条语句,实际只有name会走索引,因为name是右侧模糊匹配,得到的结果是不确定的,name字段过滤完,得到的索引行里的age和position是无序的,无法很好的利用索引。而5.6引入索引下推后,上面的sql在获取到联合索引里匹配到名字是 ‘LiLei’ 开头的索引后,还会对age和position进行过滤,用过滤后剩下的索引对应的主键id再回表查整行数据。综上所述,对于order by的优化,尽量在索引列上完成排序,遵循索引建立(索引创建的顺序)时的最左前缀法则。命令,查看rows字段的值。

西岭千秋雪的博客 1585

mysql十种优化,mysql的各种优化

mysql的各种优化mysql没索引与有索引的区别优点:当表中有大量记录时,若要对表进行查询,如果没用建立索引,搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;如果在表中针对一些字段建立了索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的...

weixin_39999781的博客 129

如何对mysql优化

MySQL 作为广泛使用的开源关系型数据库管理系统,其性能优化是保障应用高效运行的关键。无论是面对高并发访问的Web应用,还是处理大规模数据分析的系统,MySQL的性能调优都是不可或缺的一环。本文将介绍一系列MySQL优化策略与实践,帮助我们开发者和数据库管理员提升MySQL数据库的性能。

学习和分享 899

mysql 索引优化 null_MySQL 优化 —— IS NULL 优化

引言本博客翻译自 MySQL 官网:IS NULL Optimization, MySQL版本 5.7。MySQL 对 IS NULL 的优化MySQL 可以对 IS NULL 执行和常量等值判断(列名= 常量表达式,如name = 'Tom')相同的优化。MySQL 可以利用索引和范围来搜索空值。例如:SELECT * FROM tbl_name WHERE key_col IS NULL;S...

weixin_42477505的博客 663

MySQL —— 优化

概念 在应用的开发过程中,由于初期数据量小,开发人员写SQL语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多SQL语句开始逐渐显露出性能问题,对生产的影响也越来越大,此时这些有问题的SQL语句就成为整个系统性能的瓶颈,因此我们必须要对它们进行优化 MySQL优化方式有很多,大致可以从以下几点来优化MySQL: 从设计上优化 从查询上优化 从索引上优化 从存储上优化 查看SQL执行频率 MySQL客户端连接成功后,通过show [session|global] statu

weixin_46540606的博客 857

mysql 优化36_Mysql 优化建议

1、硬件层相关优化1.1、CPU相关在服务器的BIOS设置中,可调整下面的几个配置,目的是发挥CPU最大性能,或者避免经典的NUMA问题:1、选择Performance Per Watt Optimized(DAPC)模式,发挥CPU最大性能,跑DB这种通常需要高运算量的服务就不要考虑节电了;2、关闭C1E和C States等选项,目的也是为了提升CPU效率3、Memory Frequency(内...

weixin_30689519的博客 1718

mysql 语句如何优化

本文简要介绍了mysql 语句优化的9种方法和优化技巧。

m0_72958694的博客 1741
上一篇: WebMagic介绍
下一篇: 《深入理解Java虚拟机》读书笔记
刘五分
博客等级 码龄10年 15粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值