<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>数据库</title><link>http://blog.vckbase.com/jzhang/category/1267.html</link><description>数据库</description><managingEditor>jzhang</managingEditor><dc:language>zh-CHS</dc:language><generator>.Text Version 0.958.2004.214</generator><item><dc:creator>jzhang</dc:creator><title>数据库优化杂记</title><link>http://blog.vckbase.com/jzhang/archive/2009/05/04/37161.html</link><pubDate>Mon, 04 May 2009 06:10:00 GMT</pubDate><guid>http://blog.vckbase.com/jzhang/archive/2009/05/04/37161.html</guid><wfw:comment>http://blog.vckbase.com/jzhang/comments/37161.html</wfw:comment><comments>http://blog.vckbase.com/jzhang/archive/2009/05/04/37161.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/jzhang/comments/commentRss/37161.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/jzhang/services/trackbacks/37161.html</trackback:ping><description>1. 对于需要按所有列排序的情况，可以先把结果检索出来，然后创建一个视图，在视图上排序。&lt;BR&gt;2. 但是mysql的视图是没有索引的。&lt;BR&gt;3. 记录慢速查询，my.cnf配置&lt;BR&gt;; enable the slow query log, default 10 seconds&lt;BR&gt;log-slow-queries&lt;BR&gt;; log queries taking longer than 5 seconds&lt;BR&gt;long_query_time = 5&lt;BR&gt;; log queries that don’t use indexes even if they take less than long_query_time&lt;BR&gt;; MySQL 4.1 and newer only&lt;BR&gt;log-queries-not-using-indexes&lt;BR&gt;&lt;BR&gt;4.值很少的列就不要索引了，浪费&lt;BR&gt;5.太长的varchar，如果前面部分的差别大，就可以建部分索引&lt;BR&gt;6.即使有索引，如果范围太大，还是可能不用。比如where date &gt; '2000-1-1'可能就不用索引，而date &gt; '2008-12-31'可能就用了。&lt;BR&gt;原因不明，可以force index&lt;BR&gt;7. master/slave架构下，master被要求设置&lt;BR&gt;innodb_flush_log_at_trx_commit=1&lt;BR&gt;sync_binlog=1&lt;BR&gt;&lt;BR&gt;原因是为了尽可能保证数据的一致性。但是对性能影响当然很大。所以这种架构一定是基于写少读多来做的。&lt;BR&gt;8.多slave下的负载均衡&lt;BR&gt;   最简单的办法是随机选择slave&lt;BR&gt;9. --replicate-do-table=db_name.tbl_name，可以用来选择部分表同步。&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;img src ="http://blog.vckbase.com/jzhang/aggbug/37161.html" width = "1" height = "1" /&gt;</description></item><item><dc:creator>jzhang</dc:creator><title>数据库水平分区 学习备忘</title><link>http://blog.vckbase.com/jzhang/archive/2009/05/04/37158.html</link><pubDate>Mon, 04 May 2009 01:28:00 GMT</pubDate><guid>http://blog.vckbase.com/jzhang/archive/2009/05/04/37158.html</guid><wfw:comment>http://blog.vckbase.com/jzhang/comments/37158.html</wfw:comment><comments>http://blog.vckbase.com/jzhang/archive/2009/05/04/37158.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blog.vckbase.com/jzhang/comments/commentRss/37158.html</wfw:commentRss><trackback:ping>http://blog.vckbase.com/jzhang/services/trackbacks/37158.html</trackback:ping><description>好处：&lt;BR&gt;1. 等于多了一个索引。网上一些文章举的例子不很恰当。如果只有针对一列的话，分区和索引的查询速度差别很小。&lt;BR&gt;2. 因为索引也分区了，所以插入，删除，更新的速度会提升&lt;BR&gt;3. 通过分布到不同的磁盘上，提高IO吞吐率&lt;BR&gt;4. mysql内建支持，比应用层实现的分区要简单的多&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;局限：&lt;BR&gt;1. 如果查询就是需要扫描全表，可能会比不分区还要慢。当然我们要极力避免这种查询。&lt;BR&gt;2. mysql的分区功能是5.1才引入的，是否稳定？&lt;BR&gt;3. 分区表上不能有外键约束。数据的一致性维护更加复杂。比如级联删除等。当然join不影响。这种逻辑要转移到应用层实现。&lt;BR&gt;4. 和应用层的分区比较，无法分布到其他服务器上，失去了伸展性? (存疑)&lt;BR&gt;5. Mysql的表如果存在primary key或者unique key,这个key必须包含所有用于partition的字段。常规的做法是扩展primary key,&lt;BR&gt;   把真正需要partition的字段加进去。一般的表，primary key都是一个id字段，其本身用于partition的机会有，但是我们的系统里不是。&lt;BR&gt;7. If one of your partitions goes away all of your data goes away. Yikes!&lt;BR&gt;8. 如果要升级一个已有的表为partition表，极慢。&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;img src ="http://blog.vckbase.com/jzhang/aggbug/37158.html" width = "1" height = "1" /&gt;</description></item></channel></rss>