将MySQL去重操作优化到极致之三弹连发(三):用rocksdb替代innodb

前面已经建立了索引,优化了SQL语句,并将单线程变为多线程并行执行,去重时间由最初的35秒优化为3.5秒,是不是就到此为止呢?吴老师又使用了rocksdb存储引擎替代innodb的方法。这里有必要交代一下命题的背景。这道MySQL数据库优化的题目出自是阿里内部的竞赛题,当然我是听吴老师口述的,真正的题目及其竞赛规则与竞赛环境不甚明确,但有一条是允许自由选择MySQL存储引擎。在实际的生产环境中,几...
阅读(2227) 评论(2)

将MySQL去重操作优化到极致之三弹连发(二):多线程并行执行

上一篇已经将单条查重语句调整到最优,但该语句是以单线程方式执行。能否利用多处理器,让去重操作多线程并行执行,从而进一步提高速度呢?比如我的实验环境是4处理器,如果使用4个线程同时执行查重sql,理论上应该接近4倍的性能提升。一、数据分片        我们生成测试数据时,created_time采用每条记录加一秒的方式,也就是最大和在最小的时间差为50万秒,而且数据均匀分布。因此先把数据平均分成4...
阅读(2010) 评论(0)

将MySQL去重操作优化到极致之三弹连发(一):巧用索引与变量

元旦假期收到阿里吴老师来电,被告知已将MySQL查重SQL优化到极致:100万原始数据,其中50万重复,把去重后的50万数据写入目标表只需要9秒钟。这是一个惊人的数字,要知道仅是insert 50万条记录也需要些时间的。于是来了兴趣,自己实验、思考、总结做了一遍。一、问题提出        源表t_source结构如下:item_id int,created_time datetime,modif...
阅读(2086) 评论(2)

去除重复数据

有两个意义上的重复记录,一是完全重复的记录,也即所有字段均都重复,二是部分字段重复的记录。对于第一种重复,比较容易解决,只需在查询语句中使用distinct关键字去重,几乎所有数据库系统都支持distinct操作。发生这种重复的原因主要是表设计不周,通过给表增加主键或唯一索引列即可避免。select distinct * from t; 对于第二类重复问题,通常要求查询出重复记录中的任一条记录。假...
阅读(320) 评论(0)

MySQL实现树的遍历

经常在一个表中有父子关系的两个字段,比如empno与manager,这种结构中需要用到树的遍历。在Oracle 中可以使用connect by简单解决问题,参见http://blog.csdn.net/wzy0623/archive/2007/06/18/1656345.aspx,但MySQL 5.1中还不支持(据说已纳入to do中),要自己写过程或函数来实现。一、建立测试表和数据:[c-sha...
阅读(772) 评论(0)

qcache_inserts com_select 与缓存命中率

高性能MySQL这本书中关于查询缓存有一段这样的描述: Cache invalidations can happen because of fragmentation, insufficient memory, ordata modifications. If you have allocated enough memory to the cache and tuned thequery_cach...
阅读(396) 评论(0)

MySQL内存相关的主要变量

一、查询缓存1. 查询缓存命中率计算公式:Qcache_hits/(Qcache_hits + Com_select)2. 状态变量Qcache_hits查询缓存命中数,即可以从查询缓存中直接返回结果的次数Qcache_not_cached不可缓存查询数,current_date等不确定函数或者查询结果大于query_cache_limit使得查询不可缓存Qcahce_inserts被加入缓存的查...
阅读(220) 评论(0)

MySQL 分析和调整查询缓存的流程(书摘备查)

总的SELECT查询数 = Com_select + Qcache_hits + queries with errors found by parserCom_select = Qcache_inserts + Qcache_not_cached+ queries with errors found during the column-privileges check...
阅读(221) 评论(0)

MySQL里用一个表的数据更新另一个表

MySQL的update语句里可以使用join,这在用一个表的数据更新另一个表时很方便,看下面一个统计点击数的例子:[sql] view plain copy-- 建立每天点击统计表  create table daily_hit_counter  (    day  date not null,    slot tinyint unsigned not null,    cnt  int uns...
阅读(299) 评论(0)

MySQl里类似Oracle rownum的实现

[sql] view plain copy-- dense rank,写法1  set @curr_cut:=0, @prev_cnt:=0, @rank:=0;  select actor_id,          @curr_cnt:=cnt as cnt,         @rank:=if(@prev_cntas rank         @prev_cnt:=@curr_cnt as d...
阅读(475) 评论(0)

加速MySQL的alter table操作(书摘备查)

MySQL的alter table性能在表很大的时候会出现问题。MySQL执行大部分更改操作都是新建一个需要的结构的空表,然后把所有老的数据插入到新表,最后删除旧表。这会耗费很多时间,尤其是在内存紧张,而表很大并有很多索引的时候。  不是所有的alter table操作都会导致重建表。例如,可以通过两种方式创建或去掉列的默认值(一种快、一种慢)。下面是较慢的方式:alter table film ...
阅读(311) 评论(0)

InnoDB缓冲池命中率(书摘备查)

通常InnoDB存储引擎的缓冲池的命中率不应该小于99%。缓冲池命中率 = (Innodb_buffer_pool_read_requests)/(Innodb_buffer_pool_read_requests + Innodb_buffer_pool_read_ahead + Innodb_buffer_pool_reads)平均每次读取的字节数 = Innodb_data_read/Inno...
阅读(536) 评论(0)

MySQL优化特定类型的查询(书摘备查)

1. 优化countcount有两种不同的工作方式:统计值的数量和统计行的数量。值是一个非空的表达式(null意味着没有值)。如果在count()的括号中定义了列名或其它表达式,count就会统计这个表达式值的次数。count的另外一种形式就是统计结果中行的数量。当MySQL知道括号中的表达式永远不会为null的时候,它就会按这种方式工作。最明显的例子就是count(*),它是count的一种特例...
阅读(270) 评论(0)

在MySQL中建立自己的哈希索引(书摘备查)

在MySQL中,只有Memory存储引擎支持显式的哈希索引,但是可以按照InnoDB使用的方式模拟自己的哈希索引。这会让你得到某些哈希索引的特性,例如很大的键也只有很小的索引。  想法非常简单:在标准B-Tree索引上创建一个伪哈希索引。它和真正的哈希索引不是一回事,因为它还是使用B-Tree索引进行查找。然而,它将会使用键的哈希值进行查找,而不是键自身。你所要做的事情就是在where子句中手动地...
阅读(378) 评论(0)

MySQL 5.6 插入缓冲测试

设置autocommit = off innodb_flush_log_at_trx_commit = 0 innodb_buffer_pool_size = 134217728 innodb_change_buffer_max_size = 25 innodb_change_buffering = all建表create table t1 (id int auto_increment not n...
阅读(247) 评论(0)
62条 共5页1 2 3 4 5 ... 下一页 尾页
    个人资料
    • 访问:1304689次
    • 积分:17419
    • 等级:
    • 排名:第550名
    • 原创:254篇
    • 转载:20篇
    • 译文:5篇
    • 评论:155条
    博客专栏
    文章分类
    最新评论