sql优化

MySQL数据优化总结-查询备忘录

你离开我真会死。 提交于 2020-01-24 15:29:35
一、优化分类 二、测试数据样例 参考mysql官方的sakina数据库。 三、使用mysql慢查询日志对有效率问题的sql进行监控 第一个,开启慢查询日志。第二个,慢查询日志存储位置。第三个,没有使用索引的也会记录到慢查询日志中。第四个,超过1秒之后的查询记录到慢查询日志中(通常设置100ms)。 3.1、分析慢查询日志文件 3.1.1 tail命令 tail -50 /home/mysql/sql_log/mysql_slow.log,输入文件中的尾部内容,即末尾50行数据. 我们抽出其中一条,查看,如下图所示。 query_time,查询耗时(单位秒);lock_time,锁表时间。rows_sent,发送请求的行数;rows_examined,查询数据导致扫描表用到的行数。 3.1.2 官方mysqldumpslow工具 mysqldumpslow ,默认随mysql安装。 mysqldumpslow -h,可查询工具支持的命令。 mysqldumpslow -s r -t 10 /var/lib/mysql/localhost-slow.log | more ,返回结果如下图所示。 3.1.3 pt-query-digest工具 比mysqldumpslow反馈的信息多。 pg-query-digest --help 查看帮助,查看使用命令。 pg-query-digest

MySQL开发规范

只愿长相守 提交于 2020-01-24 15:25:01
MySQL开发规范 基于阿里数据库设计规范扩展而来 : https://yq.aliyun.com/articles/709387 参考,58到家MySQL军规升级版 : https://www.jianshu.com/p/c077581693fb 基础规范 表存储引擎必须使用InnoDB MySQL常见的三种存储引擎(storage_engine) : InnoDB、MyISAM、MEMORY 存储引擎就是指 表的类型以及表在计算机上的存储方式 通过“SHOW ENGINES”语句来查看 MySQL中的存储引擎 特性 innoDB MyISAM Memory 事务安全 支持 无 无 存储限制 64T 有 有 空间使用 高 低 低 内存使用 高 低 高 插入数据的速度 低 高 高 读取数据的速度 低 高 高 对外键的支持 支持 无 无 全文索引 不支持 支持 InnoDB存储引擎 InnoDB给MySQL的表提供了 事务处理 、 回滚 、 崩溃修复能力 和 多版本并发控制 的事务安全 InnoDB存储引擎总支持 AUTO_INCREMENT 。自动增长列的值不能为空,并且值必须唯一。MySQL中规定自增列必须为主键 InnoDB还支持 外键(FOREIGN KEY) 。外键所在的表叫做子表,外键所依赖(REFERENCES)的表叫做父表,父表中被子表外键关联的字段必须为主键。

mysql性能优化

旧街凉风 提交于 2020-01-24 13:46:15
数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情 1.为查询缓存优化你的查询 mysql> show variables like '%query_cache%'; (query_cache_type 为 ON 表示已经开启) +------------------------------+----------+ | Variable_name | Value | +------------------------------+----------+ | have_query_cache | YES | | query_cache_limit | 1048576 | | query_cache_min_res_unit | 4096 | | query_cache_size | 20971520 | | query_cache_type | ON | | query_cache_wlock_invalidate | OFF | +------------------------------+----------+ 如果不是ON,修改配置文件以开启查询缓存: > vi /etc/my.cnf [mysqld]中添加: query_cache_size = 20M #缓存的大小

【MySQL】执行计划EXPLAIN详解

二次信任 提交于 2020-01-24 13:18:54
首先来看下EXPLAIN执行计划包含的信息: 其中最重要的字段有 type、key、key_len、rows、Extra 。 本篇接下来将对字段进行详细的分析。 分析之前先创建表格测试: -- ---------------------------- -- Table structure for cps_commodity_info -- ---------------------------- CREATE TABLE ` cps_commodity_info ` ( ` id ` bigint ( 20 ) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键' , ` sku_id ` varchar ( 20 ) COLLATE utf8mb4_bin NOT NULL DEFAULT '0' COMMENT '商品skuId' , ` sku_name ` varchar ( 100 ) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '商品名称' , ` price ` decimal ( 10 , 2 ) NOT NULL DEFAULT '0.00' COMMENT '商品价格' , ` is_on_top ` tinyint ( 4 ) NOT NULL DEFAULT '0'

Mysql 根据时间取出每组数据中最新的一条

纵然是瞬间 提交于 2020-01-24 04:51:45
下策——查询出结果后将时间排序后取第一条 select * from a where create_time<="2017-03-29 19:30:36" order by create_time desc limit 1 这样做虽然可以取出当前时间最近的一条记录,但是一次查询需要将表遍历一遍,对于百万以上数据查询将比较费时;limit是先取出全部结果,然后取第一条,相当于查询中占用了不必要的时间和空间;还有如果需要批量取出最近一条记录,比方说:“一个订单表,有用户,订单时间,金额,需要一次性查询所有用户的最近的一条订单记录”,那么每个用户一次查询就要做一次整表的遍历,数据大的情况下,时间将会以指数形式增长,不能投入实际使用。 中策——查询排序后group by select * from ( select * from a where create_time<="2017-03-29 19:30:36" order by create_time desc ) group by user_id 后来发现使用group by 可以根据group by 的参数列分组,但返回的结果只有一条,仔细观察发现group by是将分组后的第一条记录返回。时间在查询后默认是顺序排列,因此需要先将时间倒序排列,方可取出距离当前最近一条。 这样查询实际上还是进行了两次查询

MySQL数据库优化

不羁的心 提交于 2020-01-24 00:55:09
MySQL数据库优化 概览 软优化 1.优化查询语句 2.优化子查询 3.命中索引 4.分解表 5.增加中间表 6.增加冗余字段 7.分析表、检查表、优化表 硬优化 1.cpu、内存、磁盘 2.配置参数 3.分库分表 4.缓存集群 概览 软优化 :1.优化查询语句;2.优化子查询;3.命中索引;4.分解表;5.增加中间表;6.增加冗余字段;7.分析表、检查表、优化表 硬优化 :1.cpu、内存、磁盘;2.配置参数;3.分库分表+读写分离;4.缓存集群 软优化 1.优化查询语句 使用EXPLAIN或者DESCRIBE(可简写为DESC)命令分析一条查询语句的执行信息 输入: DESC SELECT * FROM user 显示: select_type:代表查询类型,分为简单查询、子查询等等 type:代表查询策略,分为全表扫描(ALL)、索引合并(index_merge)等等 possible_keys:可能用到的索引 key:实际用到的索引 Extra:额外信息,包含Using intersect(index1,index2)、Using where、Using index等等 2.优化子查询 应该尽量使用join查询代替子查询。子查询是一个嵌套的查询,外层查询嵌套内层查询,查询时会建立内层查询的临时表,查询完毕会删除该临时表,建立和删除会有较大的系统开销

Mybatis入门

依然范特西╮ 提交于 2020-01-23 23:53:58
Mybatis入门 Mybatis简介 Mybatis中文官网: http://www.mybatis.cn/82.html Mybatis前身 Mybatis的前身是Apache的开源框架iBatis,与Hibernate一样是一个Java持久层的框架。 Mybatis的优势在于灵活,它几乎可以替代JDBC,同时提供了接口编程。目前Mybatis的数据访问层DAO(Data Access Object)是不需要实习类的,它只需要一个接口和XML(或者注解),建议使用注解来实现。Mybatis提供自动映射,动态SQL,级联,缓存,注解,代码和SQL分离等特性,使用方便,同时也对SQL进行优化。因为其具有封装少,映射多样化,支持存储过程,可以进行SQL优化等特点,是的它取代了Hibernate成为Java互联网中首选持久层框架。 Mybatis的三个优点 1.不屏蔽SQL,意味着可以更为精确定位SQL语句,可以对其进行优化和改造,这有利于互联网系统性能的提高,符合互联网需要性能优化的特点。 2.提供强大、灵活的映射机制,方便Java开发者使用。提供动态SQL的功能,允许我们根据不同组装SQL,这个功能远比其他工具或者Java编码的可读性和可维护性高得多,满足各种应用系统的同时也满足了需求经常变化的互联网应用的要求。 3.在Mybatis中,提供了使用Mapper的接口编程

MySQL子查询优化思路

余生长醉 提交于 2020-01-23 23:21:51
子查询的优化最重要的优化建议是尽可能使用关联查询来代替。 因为子查询每次查询出来的结果会暂时存放在临时表里,也会进行IO,与其如此还不如直接使用join来进行关联。 当然,也并不是所有的子查询都能使用join来代替,只有当都可以使用时才要考虑是否需要替换 来源: CSDN 作者: 学亮编程手记 链接: https://blog.csdn.net/a772304419/article/details/103898512

数据库学习之MySQL (四)——DQL DDL DML DCL 事务 到底是什么

会有一股神秘感。 提交于 2020-01-23 19:30:56
MySQL学习专栏 正在持续更新中:) 文章目录 DQL 数据查询语言 DDL 数据模式定义语言 DML 数据操作语言 DCL 数据控制语言 事务 Transaction MySQL语句众多,但有章可循,分类有助于学习 DQL 数据查询语言 DQL (data query language) query就是查询,类似question,query和JQery很像,也可以帮助记忆。 数据库语言中,查询是重点,很多优化算法和数据结构设计都是为了查询。 这里来做个实验: 我想查询大家的 工资 需要拿到一个表 名字-工资 的形式 该怎么办? 确定数据库(data1) 总表在哪(employees) 需要的栏目是什么(名字,工资) 这里就要用到 select语句 。 USE data1; SELECT `first_name`, `last_name`, `salary` FROM employees; 明显 SELECT的是“栏目” FROM的是表格名称。 对表结构还不理解,或者,没有data1库,可以看我的上一个教程: 数据库学习之MySQL (三)——简单操作数据库 小试牛刀 然后data1数据库: data1.sql 数据库文件 配合阮菜鸡的MySQL教程使用 Q1 为啥每个栏目名字都加` 符号呢? A1 设想,有个栏目叫show 系统会怎么识别? 所以这个符号是为了

MySQL 优化 —— IS NULL 优化

北城以北 提交于 2020-01-23 18:10:42
引言 本博客翻译自 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; SELECT * FROM tbl_name WHERE key_col <=> NULL; SELECT * FROM tbl_name WHERE key_col=const1 OR key_col=const2 OR key_col IS NULL; 如果 WHERE 子句包含一个 IS NULL 条件,而这个列却被声明为 NOT NULL,那么IS NULL表达式就会被优化掉。当列值未声明为非空,那么就不会发生这种优化(例如, LEFT JOIN 右侧的表)。 MySQL 也会 优化这样的条件组合 : col_name = expr OR col_name IS NULL ,这是在已解析的子查询中较常见的形式。如果发生了这种优化,那么 EXPLAIN 执行计划会出现 ref_or_null 。 This optimization can handle one IS