1        介绍 1.1     处理流程 当MYSQL 收到一条查询请求时,会首先通过关键字对SQL语句进行解析,生成一颗“解析树”,然后预处理器会校验“解析树”是否合法(主要校验数据列和表明是否存在,别名是否有歧义等),当“解析树”被认为合法后,查询优化器会对这颗“解析树”进行优化,并确定它认为最完美的执行计划. 1.2     衡量标准 MYSQL查询优化器衡量某个执行计划是否完美的标准是“使用该执行计划时的成本”,该成本的最小单位是读取一个4K数据页的成本. 下面图中的数据说明,当…
总结一下常见查询语句的优化方式 1        COUNT 1.       COUNT的作用 ·        COUNT(table.filed)统计的该字段非空值的记录行数 ·        COUNT(*)或者是COUNT(not nullable field) 统计的是全表的行数 如果要是统计全表记录数,COUNT(*)效率会比COUNT(not nullable field)要高一点 2.       MYISAM的COUNT 一般执行COUNT操作时需要扫描大量的记录,但是在My…
高性能MySql进化论(十二):Mysql中分区表的使用总结 http://binary.duapp.com/category/sql 当数据量非常大时(表的容量到达GB或者是TB),如果仍然采用索引的方式来优化查询,由于索引本生的消耗以及大量的索引碎片的产生,查询的过程会导致大量的随机I/O的产生,在这种场景下除非可以很好的利用覆盖索引,否则由于在查询的过程中需要根据索引回数据表查询,会导致性能受到很大的影响,这时可以考虑通过分区表的策略来提高查询的性能. 不同的数据库管理系统对分区的实现可能…
本文转自 http://www.imysql.cn 最近碰到一个慢SQL问题,解决过程有点小曲折,和大家分享下. SQL本身不复杂,表结构.索引也比较简单,不过个别字段存在于多个索引中. CREATE TABLE `pre_forum_post` (`pid` int(10) unsigned NOT NULL,`fid` mediumint(8) unsigned NOT NULL DEFAULT ‘0’,`tid` mediumint(8) unsigned NOT NULL DEFAULT…
6.1 为什么查询速度会慢   查询的生命周期大致可按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段.这其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序.分组等.   在完成这些任务时,查询需要在不同的地方花费时间,包括网络.CPU计算.生成统计信息和执行计划.锁等待等操作,尤其是向底层存储引擎检索数据的调用操作,这些调用需要在内存操作.CPU操作和内存不足时导致的IO操作上…
在数据库的性能调优的过程中会涉及到很多的知识,包括字段的属性设置是否合适,索引的建立是否恰当,表结构涉及是否合理,数据库/操作系统 的设置是否正确…..其中每个topic可能都是一个领域. 在我看来,在数据库性能提升关键技术中,对字段的优化难度相对较低且对性能的影响也非常的大.由于Mysql支持的数据类型比较多,且每个类型都有其独特的特性,但是有时候在选择一个具体的数据类型时,往往都是随意的选择一个能用的类型,而不会考虑到这个类型是否是最优的.在具体的类型描述之前,先来看一些针对数据类型选择的主…
在实际的应用中,往往会定期的对一个周期内的系统数据进行统计分析.例如某购物网站定期的统计商品在一个月/年期内的销售情况,如果采用扫描所有相关表的方式在某个时间点进行统计分析, 由于数据量很大,以及表结构的复杂,性能可能会是很大的问题.针对这种情况可以通过使用Summary,Cache,Counter 数据表的方式来提高分析的效率. Summary 可以理解为通过定期执行Group By 语句得到的表.例如系统要求月底的时候需要统计出每个商品的销售情况(销售数量,购买次数,总金额 …),为了达到这…
当向MySQL 发送一个请求的时候MySQL 到底做了什么? 1.客户端发送一条查询给服务器 2.服务器先检查查询缓存,如果命中了缓存,则立即返回存储在缓存中的结果.否则进入下一阶段 3.服务器端进行SQL解析.预处理,再由优化器生成对应的执行计划 4.MySQL 根据优化器生成的执行计划,调用存储引擎的API 来执行查询 5.将结果返回给客户端 注意:MySQL客户端和服务器之间的通信协议是“半双工”,这意味着,在任何时刻,要么有服务器向客户端发送数据,要么由客户端向服务器发送数据,这两个动作…
1)简单的查询分页:分每页5条 limit [offset],[rows] ,10; 2)建立id索引:查询索引id ,) limit ; 3)使用 between and 语句分页效率快N倍 ; 4)分表存储:30万条记录的id存存储到单独的一个索引表t里面:先查找索引表t里面的id索引:然后再查询 5)使用复合索引查询数据 如果对于有where 条件,又想走索引用limit的,必须设计一个索引,将where 放第一位,limit用到的主键放第2位,而且只能select 主键! 完美解决了分页…
基本原则: 更小的通常更好:占用更少的磁盘 内存和cpu缓存.如varchar(2)和varchar(100). 简单就好:比如整形比字符型代价更低.使用日期型来存储日期而不是字符串.使用整形存储ip地址. 尽量避免null:如果可以 加上not null约束.因为可以null的列使索引,索引统计,值比较都变得复杂.通常把可为null的列改为not null带来的性能提升比较小,调优时没有必要首先修正这种情况来排查问题.但是如果计划在列上建立索引,如果可以保证是not null,那么尽量加上.…