另外字段尽可能用not null 3、当然无可避免某些字段会用到text,varchar等字符类型,最好将text艾段的单独出另外一个表出来(用主键关联好) 4、 字段的类型,以及长度,是一个很考究开发者优化功力的一个方面 如果表数据有一定的量了,不妨用PROCEDURE ANALYSE()命令来取得字段的优化建议! 同理,只要一行数据时尽量使用limit 1 6、绝对不要轻易用order by rand(),很可能会导致mysql的灾难 7、每个表都应该设置一个ID主键,最好的是一个INT型,并且设置上自动增加的AUTO_INCREMENT 8、拆分大的DELETE或INSERT语句,因为这两个操作是会锁表的,表一锁住了,别的操作都进不来了,就我来说有时候我宁愿用for循环来一个个执行这些操作 9、不要用永久连接mysql_pconnet( );除非你真的非常肯定你的程序不会发生意外,不然很可能也会导致你的mysql死掉 10、永远别用复杂的mysql语句来显示你的聪明,就我来说看到一次关联了三四个表的语句,只会让人觉得很不靠谱
本文将分4个方案,讨论如何优化MySQL百万数据的深分页问题.参考 实战! 二、优化方案2.1 通过子查询优化(覆盖索引)因为以上的SQL,回表了100010次,实际上,我们只需要10条数据,也就是我们只需要10次回表其实就够了。因此,我们可以通过减少回表次数来优化。 2.3 标签记录法(要求id是有序的)limit 深分页问题的本质原因就是:偏移量(offset)越大,mysql就会扫描越多的行,然后再抛弃掉。这样就导致查询性能的下降。 select id,name,balance from account limit 1000000,10;假设上一次记录到100000,则SQL可以优化为:select id,name,balance select id,name,balance from account limit 1000000,10;如果知道边界值为100000,100010后,就可以这样优化:select id,name,balance
mysql学习总结10 — 优化(sql语句层)-锁与sql优化 Write By CS逍遥剑仙 我的主页: www.csxiaoyao.com GitHub: github.com/csxiaoyaojianxian Email: sunjianfeng@csxiaoyao.com QQ: 1724338257 sql语句层的优化主要包括锁的使用、慢查询的定位、limit分页优化 1. 慢查询定位 2.1 临时启动慢查询日志 默认未开启 $ mysqld --safe-mode -slow-query-log # 慢查询阈值默认10秒,修改为1秒 mysql> show variables (2) 查询时间 mysql> show profiles; (3) 不需要分析时关闭profile mysql> set profiling = 0; 3. limit分页优化 limit offset 预处理:(1) 设置主键索引 (2) 关闭查询缓存 分页算法: limit (page-1)*length, length; 优化方法: 业务上解决:不允许翻过100页 不用offset,用条件查询
sql语句层的优化主要包括锁的使用、慢查询的定位、limit分页优化 1. 只锁定了id=1的行 mysql> commit; 2. 慢查询定位 2.1 临时启动慢查询日志 默认未开启 $ mysqld --safe-mode -slow-query-log # 慢查询阈值默认10秒,修改为1秒 mysql> show variables (2) 查询时间 mysql> show profiles; (3) 不需要分析时关闭profile mysql> set profiling = 0; 3. limit分页优化 limit offset 预处理:(1) 设置主键索引 (2) 关闭查询缓存 分页算法: limit (page-1)*length, length; 优化方法: 业务上解决:不允许翻过100页 不用offset,用条件查询
查询优化 查询慢的原因 是否向数据库请求了多余的行 比如应用程序只需要10条数据,但是却向数据库请求了所有的数据,在显示在UI上之前抛弃了大部分数据。 索引覆盖扫描 增加汇总表 增加内存缓存系统记录数据条数 关联查询的优化 MySQL优化器关联表查询是这样进行的,比如有两个表A和B通过c列关联,MySQL会遍历A表,然后根据遍历到的c列的值去B表中查找数据 综上所述,通常,如无只需要给B表的c列加上索引即可 确保order by和group by涉及到的列只属于一个表,这样才有可能发挥索引的作用 优化子查询 对于MySQL5.5及以下版本,尽量用连接代替子查询 优化limit,比如有SQL SELECT * from sa_stockinfo ORDER BY StockAcc LIMIT 400, 5 MySQL优化器会查找405行所有列数据然后丢弃400。 优化union 如无必要,一定要用关键字 union all,这样MySQL把数据放到临时表时不会再做唯一性验证 判断某条记录是否存在,通常的做法是 select count(*) from t where
mobile是字符类型,使用了数字,应该使用字符串匹配,否则MySQL会用到隐式替换,导致索引失效。 ; 对于大分页的场景,可以优先让产品优化需求,如果没有优化的,有如下两种优化方式: 一种是把上一次的最后一条数据,也即上面的c传过来,然后做“c < xxx”处理,但是这种一般需要改接口协议,并不一定可行 in查询在MySQL底层是通过n*m的方式去搜索,类似union,但是效率比union高。 20%左右),优化器会选择通过聚集索引来查找数据。 ,可能数据量会很大,如果在方案的选择上,最终选择存储在MySQL上,并且做7天等有效期的保存。
在小伙伴们开发的项目中,对于MySQL排查问题找出性能瓶颈来说,最容易发现并解决的问题就是MYSQL的慢查询以及没有用索引的查询。 日志就跟人们写的日记一样,记录着过往的事情。 对于存在MySQL复制的情形下,从复制服务器将维护更多日志文件,被称为接替日志。 这次我们介绍的就是慢查询日志。何谓慢查询日志? MySQL会记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为慢查询,都记在慢查询日志里,我们开启后可以查看究竟是哪些语句在慢查询 ? 开启慢查询日志 mysql>show variables like “%slow%”; 查看慢查询配置,没有则在my.cnf中添加,如下 ? 分析日志 – mysqldumpslow 分析日志,可用mysql提供的mysqldumpslow,使用很简单,参数可–help查看 ? 推荐用分析日志工具 – mysqlsla ?
今天分享一下如何快速定位慢查询SQL以及优化 1.如何定位并优化慢查询SQL? 这个阈值默认是10s,线上业务一般建议把long_query_time设置为1s,如果某个业务的MySQL要求比较高的QPS,可设置慢查询为0.1s。 发现慢查询及时优化或者提醒开发改写。 客户端设置和统计慢查询日志条数就会清零,即所有配置修改会还原 命令修改配置之后,在命令行net stop mysql关闭MySQL服务,再net start mysql开启MySQL服务,接着执行show `person_info_large` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, `account` VARCHAR (10 Extra列,这里是Using index 一定要注意,Extra中出现Using filesort、Using temporary代表MySQL根本不能使用索引,效率会受到严重影响,应当尽可能的去优化
索引:(Index) 是帮助mysql高效获取数据的 数据结构 1. 索引目的在于提高查询效率,可以类比字典 2. 可以简单理解为"排好序的快速查询数据结构" 3. 服务器配置文件优化 1. MySQL允许最大的进程连接数, 2. 每个主机的连接请求异常中断的最大次数, 3. 设置表高速缓存的数目, 4. 查询优化: 1. 3. order by group by 优化 慢查询日志:
InnoDB MyISAM 事务处理 支持 不支持 全文搜索 不支持 支持 SELECT ,UPDATE,INSERT,DELETE 大量INSERT或UPDATE | DELETE 表一行一行的删除 大量SELECTDELETE | DELETE表先DROP再重建 AUTO_INCREMENT 自增计数器仅存储在主内存中 锁 表锁,行级锁 表锁 外键 支持 不支持 行数 扫描表来计算 保存行数 存储 把数据和索引存放在表空间里面 表被存放在三个文件 跨平台 跨平台可直接拷贝使用 跨平台很难直接拷贝 压
为什么优化 为了获得成就感? 为了证实比系统设计者更懂数据库? 为了从优化成果来证实优化者更有价值? no 但通常事实证实的结果往往会和您期待相反! 优化有风险,涉足需谨慎! 优化风险 1 . 优化不可避免涉及到变更,变更就有风险! 7 . 优化使性能变好,维持和变差是等概率事件! 8 . 优化不能只是数据库管理员担当风险,但会所有的人分享优化成果! 9 . 这个阶段,需要我们DBA深入业务,或者要和开发人员\业务人员配合实现 优化,最根本的是"优化"人; Mysql参数优化测试(8c32g) 服务器配置 image.png image.png time --------+-------+ 2 rows in set (0.00 sec) mysql> 一共有10个索引读取请求,有2个请求在内存中没有找到直接从硬盘中读取索引 控制在 5%以内 。 存储方式: 例子:select * from t1 where id=10; 100次 1、将select * from t1 where id=10; 进行hash运算计算出一串hash
15 MySQL优化 数据库性能优化看起来只牵扯到数据库,但其实范围涉及极广,从计算机和网络硬件到操作系统,网络设计到安全,从各种软件再到数据库本身,性能优化从来都不是单一的,而是一个整体。 在进行MySQL的优化之前,必须要了解的就是MySQL的查询过程,很多查询优化工作实际上就是遵循一些原则,让MySQL的优化器能够按照预想的合理方式运行而已。 应用程序方面: 应用程序稳定性; SQL语句性能; 串行访问资源; 性能欠佳会话管理; 这个应用适不适合用MySQL。 数据库优化方面: 内存; 数据库结构(物理&逻辑); 实例配置。 存储方面: 根据存储数据种类的不同,选择不同的存储设备; 配置合理的RAID级别(raid5、raid10、热备盘); 对与操作系统来讲,不需要太特殊的选择,最好做好冗余(raid1)(ssd 32G内存以上100M SQL优化 1. 选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。
认为必须检查的用来返回请求数据的行数; extra:using filesort、using temporary(常出现在使用order by时)时需要优化。 看到这个的时候,查询就需要优化了 -Using temporary 使用了临时表。看到这个的时候,也需要优化 (3)PROFILING分析SQL语句 1.开启profile。 包括执行状态、是否锁表等 mysql> SHOW processlist; (4)PROCEDURE ANALYSE()取得建议 通过分析select查询结果对现有的表的每一列给出优化的建议 mysql 只需在批量删除数据行之后,或定期(每周一次或每月一次)进行一次数据表优化操作即可,只对那些特定的表运行。 ; 五、定位慢查询 MySQL慢查询 六、分区 MySQL分区和分表 七、配置优化 MySQL配置优化
上篇文章是关于mysql优化的,那个内容是我大学的时候学习的笔记,最近学习发现一些比较好的内容,在这里分享给大家。 版权源于网上。 工作中使用最多的就是MySQL, 但是mysql的优化也就是通过建索引以及缓存数据来优化的。使用explain比较多。对于其他的优化技能没有使用过。 ? 1、硬件层相关优化 请一个DBA团队优化,还没有全部把机械硬盘换成ssd来的快。所以,底层硬件也是很重要的。 层相关优化 3.1、关于版本选择 官方版本我们称为ORACLE MySQL,这个没什么好说的,相信绝大多数人会选择它。 的管理维护的其他建议有: 1、通常地,单表物理大小不超过10GB,单表行数不超过1亿条,行平均长度不超过8KB,如果机器性能足够,这些数据量MySQL是完全能处理的过来的,不用担心性能问题,这么建议主要是考虑
SQL优化发生在业务量达到一定规模的时候 目的是优化SQL的执行效率 MySQL 优化 优化范围 硬件资源 操作系统参数,数据库参数配置 SQL语句,索引优化 SQL优化 数据库设计优化【规范,前期设计 】 SQL语句优化 索引优化 读写分离,分库分表 慢查询语句 慢查询:10s无返回结果,定义为慢查询 SHOW STATUS LIKE "slow_queries"; SHOW VARIABLES LIKE or num=20 可以这样查询: select id from t where num=10 union all select id from t where num 索引目的 提高查询效率 【类比字典和借书】 如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql。 ----------------2019/10/9 参考《MySQL DBA工作笔记》中杨建荣老师举得一个非常形象的例子: “比如某公司里面有一个开发小组,组长管理一些程序员,自己也参与开发工作”——B
MySQL优化 MySQL 优化方案 对于 **MySQL** 的性能优化,大部分情况下都是想减少查询所消耗的时间;而一个查询是由很多个环节组成,那么就需要从每个环节消耗时间进行入手。 配置优化(连接) 当客户端连接到服务端有可能服务端连接数不够导致应用程序获取不到连接而报出 **Mysql: error 1040: Too many connections**** **的错误。 10s,修改时间 SET @@global.long_query_time = 3; 在开启了慢日志查询后,执行下面语句后并使用 **MySQL** 提供的工具 **mysqldumpslow** 进行分析 中提供了一个执行计划工具,通过该工具可以模拟优化执行 **SQL** 查询语句的过程得到 **MySQL** 是怎么对一条 **SQL** 语句的过程并且可以对其进行分析。 通过模拟优化器执行 **SQL** 查询语句的过程得到 **MySQL** 是怎么处理一条 **SQL** 语句的并可以对其进行语句或表的性能瓶颈。
mysql多表连接查询的模式 左表和右表的共有部分,即内连接 SELECT fileds FROM TableA AS A INNER JOIN TableB AS B ON A.key1 = fields FROM TableA AS A RIGHT JOIN TableB AS B ON A.key1 = B.key2 WHERE A.key1 IS NULL; 左表的全部+右表的全部 mysql 索引的概念 官方定义:索引是帮助mysql高效获取数据的数据结构。划重点:数据结构。 查看索引 SHOW INDEX FROM tableName\G 其中,tableName是表名,\G是为了显示格式优化。 7. 适合建索引的情况 主键自动建立唯一索引 连表查询时,对外连接的字段 频繁用作查询条件的字段,即WHERE filedName = ‘xxx’ 需要排序的字段,即ORDER BY fieldName 10
为什么优化 为了获得成就感? 为了证实比系统设计者更懂数据库? 为了从优化成果来证实优化者更有价值? no 但通常事实证实的结果往往会和您期待相反! 优化有风险,涉足需谨慎! 优化风险 1 . 优化不可避免涉及到变更,变更就有风险! 7 . 优化使性能变好,维持和变差是等概率事件! 8 . 优化不能只是数据库管理员担当风险,但会所有的人分享优化成果! 9 . 避免业务逻辑错误,避免锁争用.这个阶段,需要我们DBA深入业务,或者要和开发人员\业务人员配合实现优化,最根本的是"优化"人; Mysql参数优化测试(8c32g) 服务器配置 time用于计时 dd --------+-------+ 2 rows in set (0.00 sec) mysql> 一共有10个索引读取请求,有2个请求在内存中没有找到直接从硬盘中读取索引 控制在 5%以内 。 存储方式:例子:select * from t1 where id=10; 100次1、将select * from t1 where id=10; 进行hash运算计算出一串hash值,
深度应用者则着眼于从改进Mysql软件自身层面,或者开发另外的数据库引擎和硬件应用来拓展Mysql的生态系统。 数据库层面优化 影响数据库应用性能的最重要因素其设计的合理性: 表的结构是否合适? 数据检索可以通过将数据分散存储到不同的磁盘来优化。 磁盘读写。当磁盘寻址完毕,则开始数据的读写操作。目前磁盘传输速度能够达到至少10–20MB/s。 LIMIT 10; 以下MySQL 只使用索引的情况:假定索引列是数值型的。 例如, col_name IN (10, 20, 30) 有三个等值范围,优化器对于每个范围执行两次检索,来生成行估计。 IS NULL 优化 MySQL对col_name IS NULL 的优化和对col_name = constant_value的优化方式一样。
本文主要参考官网的优化 https://dev.mysql.com/doc/refman/5.7/en/optimization.html优化SQL语句没得完美的优化方案, 要么牺牲写性能(多数情况是这样 LIMIT 10;范围优化 (range)见官网: https://dev.mysql.com/doc/refman/5.7/en/range-optimization.html不以通配符(%)开头索引合并 嵌套循环连接算法Nested-Loop Join Algorithms嵌套连接优化mysql的cross join 等价于 inner join (标准sql不是这样的)###(左右)外连接避免全表扫描优化 优化器成本模型 相当于oracle的 CBO主要跟两个表有关: mysql.server_cost 和 mysql.engine_cost如果值非空(默认NULL)的话, 计算的时候就会考虑这个值, ##外部锁外部锁定是使用文件系统锁定来管理MyISAM多个进程对数据库表的争用 innodb不涉及mysql服务器的优化系统优化:尽量不要使用swap, 性能确实比不上内存, (内存不够的除外)避免