mysql性能优化

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

优化方式

1.空间换时间(冗余)

2.时间换空间

字段优先使用类型

int > date > char > varchar > text

索引类型

btree索引、hash索引

索引的叶子下,存放一个信息指向所在行的数据地址。

btree有利于范围查询,hash有利于精确查询。

btree用的更多一些。

btree索引的常见误区

1.在where条件的常用的列上都加上索引

(因为索引同时只能用上一个)

可以用多列联合索引来处理多条件查询。

优化要实地调研,结合实际场景,然后加上多列索引。

联合索引的顺序很重要,影响着查询的效果。

为什么商品表,在价格price上加了索引,查询速度没有提升?

答:正常的查询都是复合查询,根据多条件查询,比如分类下商品的价格。可以加上(cat_id,price)复合索引来解决这个问题。

索引作用

1.提高查询速度

2.提高排序速度

3.提高分组统计速度

myisam(非聚簇索引)和innodb(聚簇索引)引擎

对应非聚簇索引和聚簇索引(都是btree索引)

非聚簇索引,索引和数据是分开的。

聚簇索引的叶子节点比较大,直接存储其他的字段的数据。

聚簇索引,当你找到索引的位置时候,就不需要回行去找数据了。直接就获取了数据。

myisam(非聚簇索引)索引指向行在磁盘上的位置。

innodb(聚簇索引)次级索引指向对主键索引的引用。

聚簇索引,乱序插入数据,最终的数据仍然是有序的。非聚簇索引,如果是乱序插入,最终的数据就会是乱序的。

Btree索引的图解,如果是性别索引,将会分成三块,男、女、null。每个对应很多数据。所以,即便快速知道男女,还是要逐条查询获取数据。

img

什么是索引覆盖?

如果查询的内容,能直接从索引上获取,那么就不需要回行到磁盘上去找数据了。这种查询效率很快。

理想的索引

查询频繁,

区分度高(不要给性别加索引),

长度小,

尽可能覆盖常用查询字段。


如果有1000条数据,去除重复后,有200个。那个相当于5条数据共用一个索引。

如果是1000条性别数据,去除重复后,只有男、女。那么相当于500条数据共用一个索引。区分度不高。


索引的添加要分析用户查询的习惯,分析查询日志,合理的添加索引。

重复索引和冗余索引

重复索引是指在同一个列,或者顺序相同的几个列,建立多个索引。

重复索引没有任何帮助,只会增加索引文件,拖累更新速度。


冗余索引允许存在。

index arttag(artid,tag) index tagart(tag,artid)

这两个索引,列有重叠,但是顺序不一样,称为冗余索引。可以利用索引的索引覆盖,快速获取数据。

索引碎片

在长期的数据更改过程中,索引文件和数据文件,都将产生空洞,形成碎片。


修复碎片,就是讲表和索引重建一下,将其码放整齐了。

sql语句优化

查找

取出


如何查的快?

联合索引的顺序,区分度,长度


如何取得快?

索引覆盖

传输的少,更少的行和列


sql语句优化思路?

不查,少查,高效的查

不查,通过业务逻辑来计算

少查,尽量精准数据,少取行。评论等信息,一次获取10到30条左右。

必须要查,尽量走索引,走索引覆盖。

explain分析

select_type

simple 不含子查询

primary 含子查询,外层叫primary,里面分多种(derived、union、subquery....)


possible_key 可能用到的索引,只能用到一个。


key 最终用到的索引。


key_len用到索引的最大长度。

定长字段,int占四个字节、date占三个字节、char(n)占n个字符。

对于变成字段varchar(n),则有n个字符+两个字节。

不同的字符集,一个字符占用的字节数不同。latin1编码的,一个字符占用一个字节,gbk编码的,一个字符占用两个字节,utf8编码的,一个字符占用三个字节。


type

all查询所有数据。

index扫描所有的索引节点,相当于index_all。

range,查询范围。

ref,引用查询。

eq_ref,准确指到一行。

const,system,null 查询速度超快。


rows代表,估计要扫描多少行。


extra

using index,速度极快,用到了索引覆盖。

using where,用到了筛选。

using temporary ,用到了临时表。不太好。

using filesort ,用到了排序。


如果查询条件中有函数,或者表达式,索引在查询上将不会被使用。索引覆盖依然有可能使用到索引。

不鼓励三表联查,多表联查说明表设计的有问题。

少用in查询,它会全部逐行搜索查询对比,查询慢。


desc table_name; # 可以查看表字段详情

EXPLAIN sql; # 可以查看语句执行情况

MySQL Key值(PRI, UNI, MUL)的含义

PRI表示主键索引

UNI表示唯一索引

MUL表示可重复索引

count

查询全部的很快,因为总数已经被记录。

但是只要加条件,就需要逐行统计。

看下面的图,大概sql逐行找,1,2,3...1000。就停止了。

沿着索引列,一边走,一边统计。

group by的列要有索引,可以避免临时表及文件排序。

order by的列要尽量跟group by 一致,否则也会引起临时表。(知其然,知其所以然。)

group by 是必排序的。

union必产生临时表。


数据少的话,sql没必要优化。但是数据量一旦指数级的增长,sql优化就非常的有必要了。

要想去重,就得排序,只要排序,数据就慢。

limit翻页优化

有意思的,当offset很大的时候,同样是取3条数据,却要20多秒。

大量的数据,拿了仍,拿了仍导致的。

优化办法:

1.业务上,不允许翻过100页。

如果经理非让翻到10000页,先在心里骂他两句,然后接着干活。

2.不用offset,用条件查询。

limit 5,3;

where id > 5 limit 3;

但是数据不可以删除,否则计算出的分页跟实际的分页不一致。



本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/7767909.html,如需转载请自行联系原作者

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2天前
|
存储 缓存 负载均衡
mysql的性能优化
在数据库设计中,应选择合适的存储引擎(如MyISAM或InnoDB)、字段类型(如char、varchar、tinyint),并遵循范式(1NF、2NF、3NF)。功能上,可以通过索引优化、缓存和分库分表来提升性能。架构上,采用主从复制、读写分离和负载均衡可进一步提高系统稳定性和扩展性。
20 9
|
5月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第三篇(MySQL性能优化)
MySQL数据库进阶第三篇(MySQL性能优化)
|
2月前
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
521 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
21天前
|
存储 关系型数据库 MySQL
MySQL性能优化实践指南
【10月更文挑战第16天】MySQL性能优化实践指南
28 0
|
21天前
|
存储 关系型数据库 MySQL
MySQL性能优化指南
【10月更文挑战第16天】MySQL性能优化指南
34 0
|
2月前
|
存储 关系型数据库 MySQL
mysql-性能优化(一)
mysql-性能优化(一)
|
2月前
|
关系型数据库 MySQL 数据处理
针对MySQL亿级数据的高效插入策略与性能优化技巧
在处理MySQL亿级数据的高效插入和性能优化时,以上提到的策略和技巧可以显著提升数据处理速度,减少系统负担,并保持数据的稳定性和一致性。正确实施这些策略需要深入理解MySQL的工作原理和业务需求,以便做出最适合的配置调整。
312 6
|
2月前
|
SQL 存储 关系型数据库
深入 MySQL 的执行计划与性能优化
深入 MySQL 的执行计划与性能优化
37 0
|
3月前
|
存储 关系型数据库 MySQL
"深入探索MySQL临时表:性能优化利器,数据处理的灵活之选"
【8月更文挑战第9天】MySQL临时表专为存储临时数据设计,自动创建与删除,仅在当前会话中存在,有助于性能优化。它分为本地临时表和全局临时表(通过特定逻辑模拟)。创建语法类似于普通表,但加TEMPORARY或TEMP关键字。适用于性能优化、数据预处理和复杂查询,需注意内存占用和事务支持问题。合理使用可大幅提升查询效率。
205 2
|
4月前
|
SQL 存储 数据库
MySQL设计规约问题之性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用
MySQL设计规约问题之性能分析工具如Sql explain、show profile和mysqlsla在数据库性能优化中有什么作用

推荐镜像

更多
下一篇
无影云桌面