MySQL优化

MySQL优化

[MySQL优化案例]系列 -- 经典游戏数据表拆分优化案例

1. 目的
通过对比测试,分析某数据表tabC拆分方案前后性能对比,确定拆分方案的可行性。

2. 方法
对拆分方案前后两种类型进行对比测试。
同时,每次测试中采用两种更新方式:
1. 和原来类似,对数据表所有字段的更新分多次
2. 对数据表所有字段的更新一次性完成

3. 环境
本次测试采用线上实际数据导入。tabC表共有132万行记录,全表共100G。
将所有字段重新组合,确保每个分表的实际行长度不高于8KB,拆分成3个子表,大小分别是:
tabC_1.ibd 796M
tabC_2.ibd 10.2G
tabC_3.ibd 8.4G

之后再进行全表随机更新,每轮测试都在脚本中并发调用存储过程来完成,最大10个并发进程。
每次测试之前都重启mysqld,且无其他额外压力,确保环境公平。

4. 结果

[MySQL优化案例]系列 -- InnoDB主键设计

众所周知,InnoDB是clustered-index table,因此对于InnoDB而言,主键具有特殊意义。可以通过主键直接定位到对应的某一数据行记录的物理位置,主键索引指向对应行记录,其他索引则都指向主键索引;因此,可以这么说,InnoDB其实就是一个 B-树索引,这棵B-树的索引就是主键,它的值则是对应的行记录。
在InnoDB数据表设计中,我们需要注意几点:

  • 1. 显式的定义一个 INT 类型自增字段的主键,这个字段可以仅用于做主键,不做其他用途
  • 2. 如果不显式定义主键的话,可能会导致InnoDB每次都需要对新数据行进行排序,严重损害性能
  • 3. 尽量保证不对主键字段进行更新修改,防止主键字段发生变化,引发数据存储碎片,降低IO性能
  • 4. 如果需要对主键字段进行更新,请将该字段转变成一个唯一索引约束字段,另外创建一个没有其他业务意义的自增字段做主键
  • 5. 主键字段类型尽可能小,能用SMALLINT就不用INT,能用INT就不用BIGINT
  • 6. 主键字段放在数据表的第一顺序

[MySQL FAQ]系列 -- 新年新思想:MySQL也能并发导入数据

对MySQL的用户而言,备受诟病的一个问题就是导入SQL备份文件时不能并发,使得导入的效率很低。
今天,我们就来改变下思路,尝试一下并发导入的方法,供大家参考。
1、问题分析
想要实现并发导入,其实没那么难,最简单的思路就是:将完整的文件切分成多份,然后并发导入即可。
在这里,我自己的做法是这样的:

1) 首先,假设只有一个库;多个库的情况也是类似,无非就是循环
2) 计算SQL文件总行数
3) 计算SQL文件总大小
4) 设定每个切分文件最大尺寸
5) 初始化表结构
技术相关: 

索引...索引...要命的索引

经历过的优化案例中,最经常碰到的就是索引的问题,要么没加索引,要么没用合适的索引,相信这也是做开发的朋友最经常碰到的盲区了,很容易就给忽略了。最近一次碰到的案例中,由于存储过程中需要创建临时表,把数据插入到临时表中,然后再做对比,开发人员认为是临时表没必要加索引,执行时间大概花了1个小时,加上索引后,不到2分钟就运行完了,至少30:1的效果啊,血淋淋的现实啊 :)

技术相关: 

MySQL优化 之 Discuz论坛优化 -- 续

很早以前写过一个文章,是关于discuz论坛的优化:MySQL优化 之 Discuz论坛优化。写的时候是2006年,没想到过了这么久,discuz论坛的问题还是困扰着很多网友,其实从各论坛里看到的问题总结出来,很关键的一点都是因为没有将数据表引擎转成InnoDB导致的,discuz在并发稍微高一点的环境下就表现的非常糟糕,产生大量的锁等待,这时候如果把数据表引擎改成InnoDB的话,我相信会好很多。这次就写个扫盲贴吧。

1. 启用innodb引擎,并配置相关参数

技术相关: 

[MySQL优化案例]系列 -- 在5.1的分区功能中混用InnoDB和MyISAM

MySQL 5.1中增加了分区(partition)功能,有了这个功能,以前很头疼的分表方案,现在就变得不再那么麻烦了。不过,如果采用了MyISAM引擎,而且在数据量较大的情境下,并发读写仍然是个问题,尤其是对索引的更新。为此,可以在分区表中采用MyISAM和InnoDB引擎混用的方法,大致如下:

[深入理解MySQL系列] - mysqldump的几个主要选项探究

0、前言

本文主要探讨 mysqldump 的几种主要工作方式,并且比较一下和 mk-parralel-dump 的一些差异,为备份方式的选择提供更多的帮助。

 

1、mysqldump

首先来看下 mysqldump 的几个主要参数的实际工作方式。

mysqldump 几个主要选项
1. -q
很简单,什么都不做,只是导出时加了一个 SQL_NO_CACHE 来确保不会读取缓存里的数据。

[InnoDB系列] - InnoDB Buffer Pool保存和还原补丁

参考文章:Making MySQL more usable: InnoDB save/restore buffer pool patch
Jeremy Cole同学写了个补丁,用于将InnoDB 缓冲池(buffer pool)里的列表在关闭mysqld时保存到本地文件中,重启启动时再加载到内存中去。该补丁目前只适用于MySQL 5.1版本。作者计划该补丁至少应具备以下几点要求:

  • 可以自定义本地文件名
  • 可以在启动时自主选择是否需要加载到内存中
  • 支持在接受用户请求前先加载一部分,剩下的可以放到后台进程中继续加载

页面

Subscribe to RSS - MySQL优化