zoukankan      html  css  js  c++  java
  • OPTIMIZE TABLE linked list 表优化原理 链表数据结构 空间再利用

     小结:

    1、加快读写;

    2、对于InnoDB表,在一定条件下,通过复制旧表重建;

    3、实践中,

    3.1、show processlist;查看线程,发现,认为堵塞读请求;

    3.2、数据长度空间不变,索引长度空间减小;历史的写操作是:url访问统计表,当天多次更新当天聚合结果数据的逻辑是“当天数据删除,再插入”(url-pv);

    MySQL :: MySQL 8.0 Reference Manual :: 13.7.3.4 OPTIMIZE TABLE Syntax https://dev.mysql.com/doc/refman/8.0/en/optimize-table.html

    MySQL 8.0 Reference Manual  /  ...  /  OPTIMIZE TABLE Syntax

    13.7.3.4 OPTIMIZE TABLE Syntax

    OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL]
        TABLE tbl_name [, tbl_name] ...

    OPTIMIZE TABLE reorganizes the physical storage of table data and associated index data, to reduce storage space and improve I/O efficiency when accessing the table. The exact changes made to each table depend on the storage engine used by that table.

    Use OPTIMIZE TABLE in these cases, depending on the type of table:

    • After doing substantial insert, update, or delete operations on an InnoDB table that has its own .ibd file because it was created with theinnodb_file_per_table option enabled. The table and indexes are reorganized, and disk space can be reclaimed for use by the operating system.

    • After doing substantial insert, update, or delete operations on columns that are part of a FULLTEXT index in an InnoDB table. Set the configuration option innodb_optimize_fulltext_only=1 first. To keep the index maintenance period to a reasonable time, set theinnodb_ft_num_word_optimize option to specify how many words to update in the search index, and run a sequence of OPTIMIZE TABLEstatements until the search index is fully updated.

    • After deleting a large part of a MyISAM or ARCHIVE table, or making many changes to a MyISAM or ARCHIVE table with variable-length rows (tables that have VARCHAR, VARBINARY, BLOB, or TEXT columns). Deleted rows are maintained in a linked list and subsequent INSERToperations reuse old row positions. You can use OPTIMIZE TABLE to reclaim the unused space and to defragment the data file. After extensive changes to a table, this statement may also improve performance of statements that use the table, sometimes significantly.

    This statement requires SELECT and INSERT privileges for the table.

    OPTIMIZE TABLE works for InnoDB, MyISAM, and ARCHIVE tables. OPTIMIZE TABLE is also supported for dynamic columns of in-memory NDBtables. It does not work for fixed-width columns of in-memory tables, nor does it work for Disk Data tables. The performance of OPTIMIZE on NDB Cluster tables can be tuned using --ndb_optimization_delay, which controls the length of time to wait between processing batches of rows by OPTIMIZE TABLE. For more information, see Previous NDB Cluster Issues Resolved in NDB Cluster 7.3.

    For NDB Cluster tables, OPTIMIZE TABLE can be interrupted by (for example) killing the SQL thread performing the OPTIMIZE operation.

    By default, OPTIMIZE TABLE does not work for tables created using any other storage engine and returns a result indicating this lack of support. You can make OPTIMIZE TABLE work for other storage engines by starting mysqld with the --skip-new option. In this case, OPTIMIZE TABLE is just mapped to ALTER TABLE.

    This statement does not work with views.

    OPTIMIZE TABLE is supported for partitioned tables. For information about using this statement with partitioned tables and table partitions, see Section 23.3.4, “Maintenance of Partitions”.

    By default, the server writes OPTIMIZE TABLE statements to the binary log so that they replicate to replication slaves. To suppress logging, specify the optional NO_WRITE_TO_BINLOG keyword or its alias LOCAL.

    OPTIMIZE TABLE Output

    OPTIMIZE TABLE returns a result set with the columns shown in the following table.

    ColumnValue
    Table The table name
    Op Always optimize
    Msg_type status, error, info, note, or warning
    Msg_text An informational message

    OPTIMIZE TABLE table catches and throws any errors that occur while copying table statistics from the old file to the newly created file. For example. if the user ID of the owner of the .MYD or .MYI file is different from the user ID of the mysqld process, OPTIMIZE TABLE generates a "cannot change ownership of the file" error unless mysqld is started by the root user.

    InnoDB Details

    For InnoDB tables, OPTIMIZE TABLE is mapped to ALTER TABLE ... FORCE, which rebuilds the table to update index statistics and free unused space in the clustered index. This is displayed in the output of OPTIMIZE TABLE when you run it on an InnoDB table, as shown here:

    mysql> OPTIMIZE TABLE foo;
    +----------+----------+----------+-------------------------------------------------------------------+
    | Table    | Op       | Msg_type | Msg_text                                                          |
    +----------+----------+----------+-------------------------------------------------------------------+
    | test.foo | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
    | test.foo | optimize | status   | OK                                                                |
    +----------+----------+----------+-------------------------------------------------------------------+

    OPTIMIZE TABLE uses online DDL for regular and partitioned InnoDB tables, which reduces downtime for concurrent DML operations. The table rebuild triggered by OPTIMIZE TABLE and performed under the cover by ALTER TABLE ... FORCE is completed in place. An exclusive table lock is only taken briefly during the prepare phase and the commit phase of the operation. During the prepare phase, metadata is updated and an intermediate table is created. During the commit phase, table metadata changes are committed.

    OPTIMIZE TABLE rebuilds the table using the table copy method under the following conditions:

    • When the old_alter_table system variable is enabled.

    • When the mysqld --skip-new option is enabled.

    OPTIMIZE TABLE using online DDL is not supported for InnoDB tables that contain FULLTEXT indexes. The table copy method is used instead.

    InnoDB stores data using a page-allocation method and does not suffer from fragmentation in the same way that legacy storage engines (such as MyISAM) will. When considering whether or not to run optimize, consider the workload of transactions that your server will process:

    MyISAM Details

    For MyISAM tables, OPTIMIZE TABLE works as follows:

    1. If the table has deleted or split rows, repair the table.

    2. If the index pages are not sorted, sort them.

    3. If the table's statistics are not up to date (and the repair could not be accomplished by sorting the index), update them.

    Other Considerations

    OPTIMIZE TABLE is performed online for regular and partitioned InnoDB tables. Otherwise, MySQL locks the table during the time OPTIMIZE TABLE is running.

    OPTIMIZE TABLE does not sort R-tree indexes, such as spatial indexes on POINT columns. (Bug #23578)

    实践

    show processlist; 

    statistics_visit Query 1238 altering table OPTIMIZE TABLE `test`
    community Sleep 56
    community Sleep 20
    statistics_visit Sleep 158
    statistics_visit Sleep 155
    statistics_visit Query 0 init show processlist
    statistics_visit Execute 104 Creating sort index SELECT address,pv,modify_time,ip FROM test WHERE uid=50016942 ORDER BY modify_time DESC LIMIT
    statistics_visit Execute 104 Sending data SELECT SUM(pv) AS c FROM test WHERE uid=50016942 UNION ALL SELECT SUM(pv) AS c FROM st
    statistics_visit Execute 96 Sending data SELECT SUM(pv) AS c FROM test WHERE uid=50016942
    statistics_visit Execute 96 Creating sort index SELECT address,pv,modify_time,ip FROM test WHERE uid=50016942 ORDER BY modify_time DESC LIMIT
    statistics_visit Execute 41 Sending data SELECT SUM(pv) AS c FROM test WHERE uid=50015592
    statistics_visit Execute 40 Creating sort index SELECT address,pv,modify_time,ip FROM test WHERE uid=50015592 ORDER BY modify_time DESC LIMIT
    statistics_visit Execute 35 Creating sort index SELECT address,pv,modify_time,ip FROM test WHERE uid=50017425 ORDER BY modify_time DESC LIMIT
    statistics_visit Execute 35 Sending data SELECT SUM(pv) AS c FROM test WHERE uid=50017425 UNION ALL SELECT SUM(pv) AS c FROM st
    statistics_visit Execute 34 Creating sort index SELECT address,pv,modify_time,ip FROM test WHERE uid=50015592 ORDER BY modify_time DESC LIMIT
    statistics_visit Execute 33 Sending data SELECT SUM(pv) AS c FROM test WHERE uid=50015592 UNION ALL SELECT SUM(pv) AS c FROM st
    statistics_visit Execute 18 Sending data SELECT SUM(pv) AS c FROM test WHERE uid=50017828
    statistics_visit Execute 18 Creating sort index SELECT address,pv,modify_time,ip FROM test WHERE uid=50017828 ORDER BY modify_time DESC LIMIT

     优化前

     

    优化后

     

    优化结果语句

    Table does not support optimize, doing recreate + analyze instead

     在优化过程中,只有读查询;

    数据长度空间不变,索引长度空间由7.63GB减少至5.25GB;

  • 相关阅读:
    Atitit。D&D drag&drop拖拽功能c#.net java swing的对比与实现总结
    Atitit.js javascript异常处理机制与java异常的转换 多重catc hDWR 环境 .js exception process Vob7
    Atitit.web 视频播放器classid clsid 大总结quicktime,vlc 1. Classid的用处。用来指定播放器 1 2. 标签用于包含对象,比如图像、音
    ListView与Adapter的那些事儿
    (转)Android反面自动静音
    (转)socket 与 file_get_contents的区别和优势的简单介绍
    Android ArrayAdapter 详解
    ImageView相关
    Android dip,px,pt,sp 的区别
    (转)Android 程序获取、设置铃声、音量、静音、扬声器
  • 原文地址:https://www.cnblogs.com/rsapaper/p/10535821.html
Copyright © 2011-2022 走看看