zoukankan      html  css  js  c++  java
  • mysql analyze和optimize

    Analyze Table

    MySQL 的Optimizer(优化元件)在优化SQL语句时,首先需要收集一些相关信息,其中就包括表的cardinality(可以翻译为“散列程度”),它表示某个索引对应的列包含多少个不同的值——如果cardinality大大少于数据的实际散列程度,那么索引就基本失效了。

    我们可以使用SHOW INDEX语句来查看索引的散列程度:

    SHOW INDEX FROM PLAYERS;

    TABLE   KEY_NAME COLUMN_NAME CARDINALITY
    ------- -------- ----------- -----------
    PLAYERS PRIMARY PLAYERNO             14

    因为此时PLAYER表中不同的PLAYERNO数量远远多于14,索引基本失效。
    下面我们通过Analyze Table语句来修复索引:

    ANALYZE TABLE PLAYERS;
    SHOW INDEX FROM PLAYERS;
    结果是:
    TABLE   KEY_NAME COLUMN_NAME CARDINALITY
    ------- -------- ----------- -----------
    PLAYERS PRIMARY PLAYERNO           1000

    此时索引已经修复,查询效率大大提高。

    需要注意的是,如果开启了binlog,那么Analyze Table的结果也会写入binlog,我们可以在analyze和table之间添加关键字local取消写入 

    Optimize Table

    如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改,则应使用 OPTIMIZE TABLE。被删除的记录被保持在链接清单中,后续的INSERT操作会重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新 利用未使用的空间,并整理数据文件的碎片。

    在多数的设置中,您根本不需要运行OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新,您也不需要经常运行,每周一次或每月一次 即可,只对特定的表运行。

    OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。

    注意,在OPTIMIZE TABLE运行过程中,MySQL会锁定表。

    与Analyze Table一样,Optimize Table也可以使用local来取消写入binlog。

    不积跬步,无以至千里!
  • 相关阅读:
    第一次项目总结
    8.16 CSS知识点7
    2016y9m22d 博文分享
    2016y9m8d
    2016y9m7d
    2016y9m6d
    2016y9m5d
    2016.9.2博文分享!
    2016y8m16d
    2016y8m15d
  • 原文地址:https://www.cnblogs.com/f66666/p/9789998.html
Copyright © 2011-2022 走看看