MySQL数据库-优化-详细优化-必看

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL数据库-优化-详细优化-必看

1. MySQL数据库 优化

MySQL数据库硬件的性能瓶颈:
1)CPU的瓶颈
2)I/O的瓶颈

对于MySQL系统本身性能优化:
1)使用索引
2)使用EXPLAIN分析查询
3)调整MySQL的内部配置

2. 索引

Ø 普通索引:这是最基本的索引类型,没唯一性之类的限制。
Ø 唯一性索引:和普通索引基本相同,但所有的索引列值保持唯一性。
Ø 主键:主键是一种唯一索引,但必须指定为”PRIMARY KEY”。
Ø 全文索引:MYSQL从3.23.23开始支持全文索引和全文检索。
在MYSQL中,全文索引的索引类型为FULLTEXT。全文索引可以在VARCHAR或者TEXT类型的列上创建。
大多数MySQL索引(PRIMARY KEY、UNIQUE、INDEX和FULLTEXT)使用B树中存储。
空间列类型的索引使用R-树,MEMORY表支持hash索引。

3. 使用索引注意事项

在查询中,WHERE条件也是一个比较重要的因素,尽量少并且是合理的where条件是很重要的,
尽量在多个条件的时候,把会提取尽量少数据量的条件放在前面,减少后一个where条件的查询时间。
应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
有些where条件会导致索引无效:
1.WHERE字句的查询条件里有不等于号(WHERE column!=…),MYSQL将无法使用索引
2.类似地,如果WHERE字句的查询条件里使用了函数(如:WHERE DAY(column)=…),MYSQL将无法使用索引
3.在JOIN操作中(需要从多个数据表提取数据时),MYSQL只有在主键和外键的数据类型相同时才能使用索引,
否则即使建立了索引也不会使用
4.如果WHERE子句的查询条件里使用了比较操作符LIKE,MYSQL只有在搜索模板的第一个字符不是通配符的情况下才能
使用索引。比如说,如果查询条件是LIKE 'abc%',MYSQL将使用索引;
如果条件是LIKE '%abc',MYSQL将不使用索引。
5.在ORDER BY操作中,MYSQL只有在排序条件不是一个查询条件表达式的情况下才使用索引。
尽管如此,在涉及多个数据表的查询里,即使有索引可用,那些索引在加快ORDER BY操作方面也没什么作用。
6.如果某个数据列里包含着许多重复的值,就算为它建立了索引也不会有很好的效果。
比如说,如果某个数据列里包含了净是些诸如“0/1”或“Y/N”等值,就没有必要为它创建一个索引。
7.如果条件中有or(并且其中有or的条件是不带索引的),
即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)。
注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
8.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

4. 索引优化建议

合理的建立索引的建议:
(1)  越小的数据类型通常更好:越小的数据类型通常在磁盘、内存和CPU缓存中都需要更少的空间,处理起来更快。 
(2)  简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂。
在MySQL中,应该用内置的日期和时间数据类型,而不是用字符串来存储时间;以及用整型数据类型存储IP地址。
(3)  尽量避免NULL:应该指定列为NOT NULL,除非你想存储NULL。在MySQL中,
含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。
你应该用0、一个特殊的值或者一个空串代替空值
 
这部分是关于索引和写SQL语句时应当注意的一些琐碎建议和注意点。
1. 当结果集只有一行数据时使用LIMIT 1
2. 避免SELECT *,始终指定你需要的列从表中读取越多的数据,查询会变得更慢。
他增加了磁盘需要操作的时间,还是在数据库服务器与WEB服务器是独立分开的情况下。
你将会经历非常漫长的网络延迟,仅仅是因为数据不必要的在服务器之间传输。
3. 使用连接(JOIN)来代替子查询(Sub-Queries)(理论上)
   连接(JOIN).. 之所以更有效率一些,是因为MySQL不需要在内存中创建临时表来完成这个逻辑上的需要两个步骤
   的查询工作。
4. 使用ENUM、CHAR 而不是VARCHAR,使用合理的字段属性长度
5. 尽可能的使用NOT NULL
6. 固定长度的表会更快
7. 拆分大的DELETE 或INSERT 语句
8. 查询的列越小越快

5. explain分析查询

使用 EXPLAIN 关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。
这可以帮你分析你的查询语句或是表结构的性能瓶颈。通过explain命令可以得到:
1)表的读取顺序
2)数据读取操作的操作类型
3)哪些索引可以使用
4)表之间的引用
5)每张表有多少行被优化器查询

6. 案例分析。

1)EXPLAIN
SELECT * FROM (
                  SELECT go_shoplist.title,
                         go_member.username
                  FROM go_shoplist
                    LEFT JOIN go_member ON go_shoplist.q_uid = go_member.uid
                  WHERE go_shoplist.sid IN (196,175,7064,1370,185,195,199,203)
                    AND go_shoplist.q_uid IS NOT NULL
                    ORDER BY id
                ) a
                GROUP BY a.title ;
2)EXPLAIN
SELECT go_shoplist.title,
                     go_member.username
              FROM go_shoplist
                LEFT JOIN go_member ON go_shoplist.q_uid = go_member.uid
              WHERE go_shoplist.id IN (
                          SELECT MAX(id) FROM go_shoplist
                          WHERE go_shoplist.sid IN (196,175,7064,1370,185,195,199,203)
                            AND go_shoplist.q_uid IS NOT NULL
                            GROUP BY sid
                          )
              ORDER BY go_shoplist.id DESC;
为什么第二个更慢?
答: mysql 在处理子查询时,会改写子查询。
    通常情况下,我们希望由内到外,先完成子查询的结果,然后再用子查询来驱动外查询的表,完成查询。
    上一页的sql语句,通常我们会感性地认为该 sql 的执行顺序是:
    go_shoplist 表中根据 sid in (…)取得 max(id)记录,
    然后再到 go_shoplist中,带入 id in (…)取得查询数据。
    但是实际mysql的处理方式为:
    select * from go_shoplist … where exists (
    select * from go_shoplist where sid in (…)
    )
    mysql 将会扫描 go_shoplist 中所有数据,每条数据都将会传到子查询中与 go_shoplist 关联,
    子查询不会先被执行,所以如果 go_shoplist表很大的话,那么性能上将会出现问题。
3)还能继续优化吗?
答:   SELECT a.id,b.title,d.username
      FROM go_shoplist b
      RIGHT JOIN (SELECT MAX(id) AS id FROM go_shoplist c
                  WHERE c.sid IN (196,175,7064,1370,185,195,199,203)
                    AND c.q_uid IS NOT NULL
                    GROUP BY c.sid ) a ON a.id = b.id
      LEFT JOIN go_member d ON b.q_uid = d.uid
4)用explain看看好在哪了。

7. 配置优化

连接请求的变量:
1)max_connections: max_used_connections / max_connections * 100% (理想值≈ 85%)
2)back_log:默认数值是50,可调优为128,对于Linux系统设置范围为小于512的整数
3)interactive_timeout:默认数值是28800,可调优为7200

8. 其他优化建议

1)in 和 not in 要慎用(前面提到了)
2)应尽量避免在 where 子句中对字段进行表达式操作,
如:select id from t where num/2=100 
应改为: select id from t where num=100*2
3)在使用索引字段作为条件时,如果该索引是复合索引,
那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,
否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致
4)索引并不是越多越好,索引固然可以提高相应的 select 的效率,
但同时也降低了 insert 及 update 的效率
5)不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的字段
6)尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写
7)尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理
8)能用UNION ALL就不要用UNION
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7天前
|
数据库 索引
如何优化数据库索引?
【8月更文挑战第14天】如何优化数据库索引?
19 4
|
6天前
|
存储 SQL 缓存
优化数据库
【8月更文挑战第15天】优化数据库
10 1
|
7天前
|
SQL 存储 数据库
OceanBase数据库优化
【8月更文挑战第14天】OceanBase数据库优化
10 2
|
7天前
|
数据库连接 数据库
实现加载驱动、得到数据库对象、关闭资源的代码复用,将代码提取到相应的工具包里边。优化程序
该博客文章展示了如何通过创建工具类`Connectiontools`实现数据库连接、语句执行以及资源关闭的代码复用,以优化程序并提高数据库操作的效率和安全性。
|
10天前
|
SQL 关系型数据库 MySQL
"告别蜗牛速度!解锁批量插入数据新姿势,15秒狂插35万条,数据库优化就该这么玩!"
【8月更文挑战第11天】在数据密集型应用中,高效的批量插入是性能优化的关键。传统单条记录插入方式在网络开销、数据库I/O及事务处理上存在明显瓶颈。批量插入则通过减少网络请求次数和数据库I/O操作,显著提升效率。以Python+pymysql为例,通过`executemany`方法,可实现在15秒内将35万条数据快速入库,相较于传统方法,性能提升显著,是处理大规模数据的理想选择。
27 5
|
9天前
|
存储 缓存 运维
优化高并发环境下的数据库查询性能:实战经验与技巧
在高并发环境下,数据库性能往往成为系统瓶颈。本文将深入探讨在高并发场景下优化数据库查询性能的策略与实践,包括索引优化、查询优化、数据库架构设计以及缓存机制的应用。通过对具体案例的分析,读者将能够掌握提升数据库性能的关键技术,从而在面对大规模用户请求时提高系统的响应速度和稳定性。
|
9天前
|
存储 关系型数据库 MySQL
MySQL 上亿大表,如何深度优化?
【8月更文挑战第11天】随着大数据时代的到来,MySQL 作为广泛使用的关系型数据库管理系统,经常需要处理上亿级别的数据。当数据量如此庞大时,如何确保数据库的查询效率、稳定性和可扩展性,成为了一个亟待解决的问题。本文将围绕 MySQL 上亿大表的深度优化,分享一系列实用的技术干货,帮助你在工作和学习中应对挑战。
26 1
|
11天前
|
监控 Oracle 关系型数据库
"深度剖析:Oracle SGA大小调整策略——从组件解析到动态优化,打造高效数据库性能"
【8月更文挑战第9天】在Oracle数据库性能优化中,系统全局区(SGA)的大小调整至关重要。SGA作为一组共享内存区域,直接影响数据库处理能力和响应速度。本文通过问答形式介绍SGA调整策略:包括SGA的组成(如数据缓冲区、共享池等),如何根据负载与物理内存确定初始大小,手动调整SGA的方法(如使用`ALTER SYSTEM`命令),以及利用自动内存管理(AMM)特性实现智能调整。调整过程中需注意监控与测试,确保稳定性和性能。
23 2
|
12天前
|
SQL 关系型数据库 分布式数据库
PolarDB Proxy配置与优化:提升数据库访问效率
PolarDB是阿里云的高性能分布式数据库,PolarDB Proxy作为关键组件,解析并转发SQL请求至集群。本文概览PolarDB Proxy功能,包括连接池管理、负载均衡及SQL过滤;并提供配置示例,如连接池的最大连接数与空闲超时时间设置、一致哈希路由及SQL安全过滤规则。最后探讨了监控调优、查询缓存及网络优化策略,以实现高效稳定的数据库访问。
50 2