[MySQL优化案例]系列 -- InnoDB主键选择
2010/08/02/sth_about_innodb_primary_key_select.html
众所周知,InnoDB是clustered-index table,因此对于InnoDB而言,主键具有特殊意义。可以通过主键直接定位到对应的某一数据行记录的物理位置,主键索引指向对应行记录,其他索引则都指向主键索引;因此,可以这么说,InnoDB其实就是一个 B-树索引,这棵B-树的索引就是主键,它的值则是对应的行记录。
在InnoDB数据表设计中,我们需要注意几点:
问题:用MySQL实现发号器功能,确保每次取到的ID号都是唯一的
实现:下面是一个大致的思路,抛个砖,欢迎回帖。
根据号段大小,决定是否分成多个表,每个表事先填充各个不同的号段。
每个应用端取号时,设置事务隔离级别为:REPEATABLE READ,并且采用下面的方式读取数据
SELECT `ID` FROM `ID_RANGE_XX` ORDER BY ID LIMIT 1 FOR UPDATE
在上述情境中,只要选择某个ID号,那么其他终端也在读取该号时,会产生锁等待,而不会发生ID号被重用的情况。
其实很简单,就是利用正则表达式,从文件中抽取,可以用awk或sed,例如:
1. 抽取数据库 imysql_1 的全部SQL语句
#假设数据库 imysql_1 的下一个是 imysql_2 DBNAME1="imysql_1" DBNAME2="imysql_2" sed -n “/^-- Current Database: \`$DBNAME1\`/,/^-- Current Database: \`$DBNAME2\`/p” imysql_20100601.sql
2. 抽取数据表 user_base 的全部SQL语句
如果问这样的问题,我只能说你很菜鸟,哈哈。
不过,也不能全怪你,因为mysql的默认配置确实比较差劲,也没做最基本的优化调整。
现在的服务器,即使是办公用的PC,内存也大多1~2G了吧,默认配置分配给innodb的buffer pool才8M,真是服了,多少年了,也不改改。
还有另一个害人的地方是innodb数据文件的默认大小是10M,这个一般情况下,建议至少大于256M或512M。
最后给大家一个实用的小配置:秀下我的mysql客户端配置。
对MySQL的用户而言,备受诟病的一个问题就是导入SQL备份文件时不能并发,使得导入的效率很低。
今天,我们就来改变下思路,尝试一下并发导入的方法,供大家参考。
1、问题分析
想要实现并发导入,其实没那么难,最简单的思路就是:将完整的文件切分成多份,然后并发导入即可。
在这里,我自己的做法是这样的:
1) 首先,假设只有一个库;多个库的情况也是类似,无非就是循环 2) 计算SQL文件总行数 3) 计算SQL文件总大小 4) 设定每个切分文件最大尺寸 5) 初始化表结构
问: 如果密码中包含反斜线,该如何处理呢?
答: 在mysql中,反斜线"\"是有特殊意义的,用于转义,因此如果密码中包含"\",就需要特别注意。有一种一劳永逸的办法,就是在密码中不用反斜线,哈哈。另一种,那就是需要多加几个反斜线,例如:
(root:hostname:Thu Oct 15 09:15:38 2009)[mysql]> grant usage on *.* to yejr@localhost identified by 'ye\\\jr';
Query OK, 0 rows affected (0.02 sec)
(root:imysql.cn:Thu Oct 15 09:16:22 2009)[mysql]> select password('ye\jr');
+-------------------------------------------+
| password('ye\jr') |
问题
环境
硬件:DELL 1950, 146G SAS 15K RPMS * 2, 8G Ram
软件:2.6.9-55.ELsmp x86_64, mysql 5.1.x
现象
2个库,其中1个业务库下有20多个表,表文件大小总量不到2G。
另一个为日志库,下400多个表,大致是每天会产生5个表,其中有一个表较大,约400MB,总量约40多GB。
每次备份耗时较长,最严重的一次花了5个多小时才完成。
业务库为当前活动库,日志库则主要用作备份,每天日志归档,过期数据表很少有读写请求。
问题:
执行 show engine innodb status\G 时,显示的信息不全,DEADLOCK相关信息太多,后面的都没了
原因:
这是mysql客户端的一个bug:BUG#19825,交互式客户端限制了输出信息最大为 64KB,因此更多的信息无法显示。
mysqlslap是官方提供的压力测试工具之一,官方介绍如下:
mysqlslap is a diagnostic program designed to emulate client load for a MySQL server and to report the timing of each stage. It works as if multiple clients are accessing the server. mysqlslap is available as of MySQL 5.1.4.
最近评论
3 天 9 小时 前
3 天 16 小时 前
1 周 3 天 前
1 周 5 天 前
2 周 6 天 前
3 周 3 天 前
3 周 4 天 前