日期:2014-05-16  浏览次数:20903 次

mysql的一些问题(仅作记录)
1、在数据系统中如何使用 Merge 来进行分表,出现了哪些问题?
答:因为 MERGE 总表的主键和唯一索引无效,导致 REPLACE INTO 语法对 MERGE 总表不起作用,所以可能出现各个 MERGE 子表存在相同主键的情况,产生数据错误。
?
2、(见复印纸)在 employees1 和 employees2 中是否会出现相同主键的记录,何种情况出现,现在使用的解决方法是什么?
答:有可能出现,原因参考问题1。
假设插入记录 R1 到?employees 总表中,因为我们设定了是插入到 employees1 中,如果此时 employees2 存在跟 R1 相同主键的记录,那么该记录就在两个子表中都存在。
目前数据系统的解决方法是,在插入数据前,先将旧的记录删除(通过主键匹配),然后再插入。这个方法存在隐患,例如删除成功但插入失败,还有删除之后、插入之前,数据会有一段空白时间。
?
3、在对 employess 表进行?REPLACE 操作时采用先删后插的方法时候会存在隐患,是否可以通过进行锁表和事务来解决?
答:因为 MERGE 只支持 MyISAM,而 MyISAM 不支持事务,所以事务并不能解决这个隐患。
目前想到的解决该隐患的方法是,每次插入之前,都先判断一下该条记录属于哪个子表,然后就直接 REPLACE 到该子表进去,而不是 REPLACE 到总表,这样主键、唯一索引就能生效,然后正确地 REPLACE。
这个改动目前仍未实施,因为考虑到发生问题的可能性较小,而且目前正忙于准备上海数据系统的上线,所以计划待上海数据系统的开发大体完成,或者上线之后,再改这个bug。
?
4、Partition是否可以使用不带分区字段限制条件的语句来查询,分区的性能如何?
答:查询中可以不包含分区字段,但这样会使得分区的功能无效,直接查询总表。
关于分区的性能,我们自己还没有实际的环境进行测试,但可以参考这篇文章:http://fanqiang.chinaunix.net/db/mysql/2006-05-08/4135.shtml 。
?
5、针对数据分表,可否用这样的设计:一个总表来做数据的同步更新和完整数据的查询,然后再建一个小表,只保存最频繁查询的部份数据,小表的更新则是异步的?
答:这样的设计可以解决上述数据分表时的隐患,值得考虑。
?
6、EXPLAIN中出现了所谓的偏差是怎么回事?
答:EXPLAIN 的结果,是有可能存在偏差和错误的,只能参考。
举一个简单的例子,运行 "EXPLAIN SELECT * FROM tbl LIMIT 10",实际上只会扫描10条记录,但 EXPLAIN 结果的 rows 显示的不是10,而是 tbl 表的总数。这是因为 EXPLAIN 没有把 LIMIT 考虑进去(好像新版本的 MySQL 解决了这个问题,有待查证)。
关于 EXPLAIN 的限制和偏差的更多信息,请参考这篇文章:http://www.mysqlperformanceblog.com/2006/07/24/mysql-explain-limits-and-errors/ 。
?