mysql优化

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: sql优化最近面试,在sql优化这块,一直都不是很熟悉,于是有了以下的总结,主要是在鲁玉成先生的笔记基础上,加入自己的理解。原文链接如下:http://www.cnblogs.com/luyucheng/p/6323477.

sql优化

最近面试,在sql优化这块,一直都不是很熟悉,于是有了以下的总结,主要是在鲁玉成先生的笔记基础上,加入自己的理解。原文链接如下:
http://www.cnblogs.com/luyucheng/p/6323477.html

1.sql语句的优化

a.使用limit对查询结果的记录进行限定
b.避免select * ,将需要查找的字段列出来
c.使用连接(join)来代替子查询
d.拆分大的delete或者insert语句

1.1子查询
1.1.1mysql的五种查询子句:
    where:条件查询
    group by:按照属性名指定的字段进行分组
        其他字段如果想出现在select中,则必须包含在聚合函数中:
        min(),max(),sum(),avg(),count()
    having:有group by才能有having,满足条件在group by的属性名中输出
    order by:按照属性名指定的字段进行排序。排序方式有“asc”,"desc"
    limit:限制结果集
1.1.2子查询:
    where 子查询
        查询每个类别下id最大的商品
        select goods_id,goods_name,cat_id,shop_price from goods 
            where goods_id In
            (select max(goods_id) from goods group by cat_id);
    from型子查询
        select goods_id,goods_name,cat_id,shop_price from
            (select goods_id,goods_name,cat_id,shop_price from goods order by cat_id asc,goods_id desc)as temp 
            group by cat_id;
    exists子查询
    从类别表中取出其类别下有商品的类别(如果该类别下没有商品,则不取出)[使用exists子查询]
     SELECT c.cat_id,c.cat_name FROM category c WHERE EXISTS (SELECT 1 FROM goods g WHERE g.cat_id = c.cat_id);
1.2连接查询
1、全相乘,做笛卡儿积。(效率低)
2、左连接查询 left join ... on ... 
3、右连接查询 right join ... on ...
4、内连接查询 inner join ... on ...
5、全连接查询 full join ... on ...
6、联合查询 
    6.1、将两张表的数据合并查询出来
        SELECT id, content, user FROM comment UNION (SELECT id, msg AS content, user FROM feedback);
    6.2、union查询,列名不一致时,以第一条sql语句的列名对齐
    6.3、使用union会将重复的行过滤掉
    6.4、使用union all 查询所有,重复的行不会被过滤
        SELECT content,user FROM comment UNION ALL (SELECT msg, user FROM feedback);
    6.5、union查询,如果列数不相等,会报列数不相等错误
    6.6、union后的结果集还可以再筛选
        SELECT id,content,user FROM comment UNION ALL (SELECT id, msg, user FROM feedback) ORDER BY id DESC;
        注意order by放在排序放在内层sql是不起作用的,因为union查出来的结果会自动排序。但是内层,order by 和limit一起使用,就不会被优化掉
2.选择合适的数据类型
(1)使用可存下数据的最小的数据类型,整型 < date,time < char,varchar < blob
(2)使用简单的数据类型,整型比字符处理开销更小,因为字符串的比较更复杂。如,int类型存储时间类型,bigint类型转ip函数
(3)使用合理的字段属性长度,固定长度的表会更快。使用enum、char而不是varchar
(4)尽可能使用not null定义字段
(5)尽量少用text,非用不可最好分表
3.选择合适的索引列
(1)查询频繁的列,在where,group by,order by,on从句中出现的列
(2)where条件中<,<=,=,>,>=,between,in,以及like 字符串+通配符(%)出现的列
(3)长度小的列,索引字段越小越好,因为数据库的存储单位是页,一页中能存下的数据越多越好
(4)离散度大(不同的值多)的列,放在联合索引前面。查看离散度,通过统计不同的列值来实现,count越大,离散程度越高:
SELECT COUNT(DISTINCT column_name) FROM table_name;
4.使用命令分析
(1)SHOW查看状态
    1.显示状态信息
        mysql> SHOW [SESSION|GLOBAL] STATUS LIKE '%Status_name%';
        session(默认):取出当前窗口的执行
        global:从mysql启动到现在
    (a)查看查询次数(插入次数com_insert、修改次数com_insert、删除次数com_delete)
        mysql> SHOW STATUS LIKE 'com_select';
    (b)查看连接数(登录次数)
        mysql> SHOW STATUS LIKE 'connections';
    (c)数据库运行时间
        mysql> SHOW STATUS LIKE 'uptime';
    (d)查看慢查询次数
        mysql> SHOW STATUS LIKE 'slow_queries';
    (e)查看索引使用的情况:
        mysql> SHOW STATUS LIKE 'handler_read%';
            handler_read_key:这个值越高越好,越高表示使用索引查询到的次数。
            handler_read_rnd_next:这个值越高,说明查询低效。
    2.显示系统变量
        mysql> SHOW VARIABLES LIKE '%Variables_name%';
    3.显示InnoDB存储引擎的状态
        mysql> SHOW ENGINE INNODB STATUS;
    (2)EXPLAIN分析查询
        mysql> EXPLAIN SELECT column_name FROM table_name;
        explain查询sql执行计划,各列含义:
            table:表名;
            type:连接的类型
                -const:主键、索引;
                -eq_reg:主键、索引的范围查找;
                -ref:连接的查找(join)
                -range:索引的范围查找;
                -index:索引的扫描;
                -all:全表扫描;
            possible_keys:可能用到的索引;
            key:实际使用的索引;
            key_len:索引的长度,越短越好;
            ref:索引的哪一列被使用了,常数较好;
            rows:mysql认为必须检查的用来返回请求数据的行数;
            extra:using filesort、using temporary(常出现在使用order by时)时需要优化。
                -Using filesort  额外排序。看到这个的时候,查询就需要优化了
                -Using temporary 使用了临时表。看到这个的时候,也需要优化
    (3)PROFILING分析SQL语句
        1.开启profile。查看当前SQL执行时间
            mysql> SET PROFILING=ON; 
            mysql> SHOW profiles;
        2.查看所有用户的当前连接。包括执行状态、是否锁表等
            mysql> SHOW processlist;
    (4)PROCEDURE ANALYSE()取得建议
        通过分析select查询结果对现有的表的每一列给出优化的建议
        mysql> SELECT column_name FROM table_name PROCEDURE ANALYSE();
    (5)OPTIMIZE TABLE回收闲置的数据库空间
        mysql> OPTIMIZE TABLE table_name;
        对于MyISAM表,当表上的数据行被删除时,所占据的磁盘空间并没有立即被回收,使用命令后这些空间将被回收,并且对磁盘上的数据行进行重排(注意:是磁盘上,而非数据库)。
        对于InnoDB表,OPTIMIZE TABLE被映射到ALTER TABLE上,这会重建表。重建操作能更新索引统计数据并释放成簇索引中的未使用的空间。
        只需在批量删除数据行之后,或定期(每周一次或每月一次)进行一次数据表优化操作即可,只对那些特定的表运行。
    (6)REPAIR TABLE修复被破坏的表
           mysql> REPAIR TABLE table_name;
    (7)CHECK TABLE检查表是否有错误
        mysql> CHECK TABLE table_name;
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
3月前
|
SQL 缓存 关系型数据库
MySQL 慢查询是怎样优化的
本文深入解析了MySQL查询速度变慢的原因及优化策略,涵盖查询缓存、执行流程、SQL优化、执行计划分析(如EXPLAIN)、查询状态查看等内容,帮助开发者快速定位并解决慢查询问题。
149 0
|
1月前
|
缓存 关系型数据库 MySQL
降低MySQL高CPU使用率的优化策略。
通过上述方法不断地迭代改进,在实际操作中需要根据具体场景做出相对合理判断。每一步改进都需谨慎评估其变动可能导致其他方面问题,在做任何变动前建议先在测试环境验证其效果后再部署到生产环境中去。
80 6
|
2月前
|
存储 SQL 关系型数据库
MySQL 核心知识与索引优化全解析
本文系统梳理了 MySQL 的核心知识与索引优化策略。在基础概念部分,阐述了 char 与 varchar 在存储方式和性能上的差异,以及事务的 ACID 特性、并发事务问题及对应的隔离级别(MySQL 默认 REPEATABLE READ)。 索引基础部分,详解了 InnoDB 默认的 B+tree 索引结构(多路平衡树、叶子节点存数据、双向链表支持区间查询),区分了聚簇索引(数据与索引共存,唯一)和二级索引(数据与索引分离,多个),解释了回表查询的概念及优化方法,并分析了 B+tree 作为索引结构的优势(树高低、效率稳、支持区间查询)。 索引优化部分,列出了索引创建的六大原则
|
7月前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(07) 她气鼓鼓递来一条SQL | 怎么看执行计划、SQL怎么优化?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。掌握如何判断SQL执行慢、以及如何分析SQL执行计划、优化SQL的技能,在工作中解决SQL性能问题显得非常关键。
|
2月前
|
存储 SQL 关系型数据库
MySQL 动态分区管理:自动化与优化实践
本文介绍了如何利用 MySQL 的存储过程与事件调度器实现动态分区管理,自动化应对数据增长,提升查询性能与数据管理效率,并详细解析了分区创建、冲突避免及实际应用中的关键注意事项。
120 0
|
4月前
|
存储 SQL 关系型数据库
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
京东面试:mysql深度分页 严重影响性能?根本原因是什么?如何优化?
|
9月前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
1803 10
|
6月前
|
存储 关系型数据库 MySQL
MySQL细节优化:关闭大小写敏感功能的方法。
通过这种方法,你就可以成功关闭 MySQL 的大小写敏感功能,让你的数据库操作更加便捷。
469 19
|
7月前
|
SQL 关系型数据库 MySQL
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
256 9
|
7月前
|
关系型数据库 MySQL 数据库
从MySQL优化到脑力健康:技术人与效率的双重提升
聊到效率这个事,大家应该都挺有感触的吧。 不管是技术优化还是个人状态调整,怎么能更快、更省力地完成事情,都是我们每天要琢磨的事。
159 23

推荐镜像

更多