Simple Life

和这个世界交手这许多年   你是否光彩依旧,兴致盎然...

您现在的位置是:首页 爱折腾 爱折腾详情

《高性能Mysql》读书笔记

发布时间:2015-8-15 作者:Felix 浏览(1175)

    一直是断断续续的接触mysql,这阵子经常去图书馆,顺便买了本《高性能Mysql》看看,准备系统的学习下。这本书非常不错,算是经典中的经典,对应的是mysql5.5的版本。自己写了些读书笔记,不是很全,就当记录下,有些知识点内容太多就直接在书上画重点了,我觉得这本书值得放在书桌上,随时翻翻。


    1. 使用explain去执行计划解读

        http://blog.csdn.net/xifeijian/article/details/19773795


    2. 衡量mysql查询开销

        a. 响应时间

        b. 扫描的行数

        c. 返回的行数


    3. 切分查询

        normal:

            delete from table_name where create_time < ‘20151212’;

        advanced:

            rows_affected = 0

            do {

                  rows_affected = do_query("delete from table_name where create_time < ‘20151212 limit 10000")

            } while rows_affected > 0

        同时每次删除数据后都暂停一会儿,这样可以将服务器一次性的压力分散到很长的时间段。


    4. 分解关联查询

       a. 缓存的效率更高

       b. 执行单个查询,减少锁的竞争

       c. 在应用层做关联,更容易对数据库进行拆分,更容易做到高性能和可扩展

       d. 查询效率提升, in代替随机关联查询。

   

    5. mysql的关联查询

        任何关联都执行潜逃循环关联操作,即mysql现在一个表循环取出单条数据,然后再嵌套循环到下一个表中寻找匹配的行,直到找到所有表中匹配的行为止。然后根据各个表匹配的行,返回查询中需要的列。


    6. mysql 的排序

        如果数据量小于“排序缓冲区”,mysql使用内存进行快速排序,如果内存不够则现将数据分块,然后每个独立块使用快速排序,并将排序结果放在磁盘上,然后将各个排序好的块进行合并,然会排序结果。

        可以使用索引来加速排序


    7.  mysql的in子查询是效率很低的, 可以使用inner join 或者是exists代替(踩过坑!


    8.  mysql总是通过创建并填充临时表的方式来执行union查询,因此很多优化策略在union查询中都无法很好的使用,需要手动的加到各子查询中。一般使用union all,除非确实需要服务器消除重复行。

    

    9. 快速载入数据到MyISAM表:  

        先禁用索引、载入数据、然后重新启用索引 

        alter table table_name disable keys 

         —load the data 

        alter table table_name enable keys 

        解释:构建索引的工作被延迟到数据完全载入以后,这个时候可以通过排序来构建索引。这样做会快很多,并且使得索引树的碎片更少、更紧凑。


    10. 范式设计和反范式设计的混合使用


    11. 索引的优点

         a. 索引大大减少了服务器需要扫描的数据量

         b. 索引可以帮助服务器避免排序和临时表

         c.索引可以将随机I/O变为顺序I/O


    12. 前缀索引是一种能使索引更小、更快的有效办法

       (缺点:无法使用前缀索引去做order by和group by 也无法使用前缀索引做覆盖扫描)

         示例:alter table table_name add key(city(7));


    13. 索引顺序:

         当不需要考虑排序和分组时,将选择性最高的列放在前面通常是很好的。这时候索引的作用只是用于优化where条件的查找。


    14. 数据库损坏: 

          check table table_name

          a. repair table table_name;

          b. alter table table_name engine=innodb;

    

    15. mysql锁详解:

          http://blog.csdn.net/xifeijian/article/details/20313977


基于 Django 搭建

服务器采用的 阿里云

域名来自 万网

苏ICP备16015443号

©2015-2016 felixglow.com.

GitHub

Design by Felix