Mysql

跳過 YZ 的 X 塊,因為 MySQL 沒有選擇索引而不是 word_sid_typeindex

  • October 11, 2016

我的環境:

# cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 6.8 (Santiago)
# uname -a
Linux A.B.C 2.6.32-642.4.2.el6.x86_64 #1 SMP Mon Aug 15 02:06:41 EDT 2016 x86_64 x86_64 x86_64 GNU/Linux
# rpm -q mysql-server percona-toolkit
mysql-server-5.1.73-7.el6.x86_64
percona-toolkit-2.2.19-1.noarch
# 

我正在執行pt-table-checksum,我收到以下錯誤:

跳過 YZ 的塊 X,因為 MySQL 沒有選擇索引而不是 word_sid_typeindex。

mysql> DESCRIBE search_index;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| word  | varchar(50)      | NO   | MUL |         |       |
| sid   | int(10) unsigned | NO   | MUL | 0       |       |
| type  | varchar(16)      | YES  |     | NULL    |       |
| score | float            | YES  |     | NULL    |       |
+-------+------------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> SHOW TABLE STATUS WHERE Name='search_index'\G;
*************************** 1. row ***************************
          Name: search_index
        Engine: InnoDB
       Version: 10
    Row_format: Compact
          Rows: 3155432
Avg_row_length: 51
   Data_length: 163250176
Max_data_length: 0
  Index_length: 415514624
     Data_free: 839909376
Auto_increment: NULL
   Create_time: 2016-09-01 21:14:58
   Update_time: NULL
    Check_time: NULL
     Collation: utf8_general_ci
      Checksum: NULL
Create_options: 
       Comment: 
1 row in set (0.13 sec)

ERROR: 
No query specified

mysql> 

請指教。

該消息既令人期待又令人不安。

為什麼預期?

我一點也不覺得這條消息令人不安。我希望pt-table-checksum繞過塊,因為沒有定義的唯一性。當然,當沒有 PRIMARY KEY 或 UNIQUE INDEX 時,InnoDB 將創建一個名為 gen_clust_index 的基於行的索引。因此,從表中讀取的塊除了插入順序外,對其順序沒有押韻或理由。

為什麼令人不安?

由於您在問題上有一個複制標籤,現在這變得令人不安。

當您在主設備上進行多次寫入時,從設備可能以與主設備不同的順序寫入行。如果search_index表有 aPRIMARY KEY或 a UNIQUE INDEX,那將穩定校驗和評估。不幸的是,對於具有內部生成索引(gen_clust_index)的表作為唯一形式的唯一形式的表,這不能說是在主和從上的 InnoDB 表。

解決方案

  1. search index在 Master 上定義 PRIMARY KEY 。
  2. mysqldumpsearch_index從 Master 載入到 Slave

這就是我的建議:

  • 跑步SHOW INDEXES FROM Y.Z\G
  • 使用--chunk-index選項中基數最高的索引
  • 使用不同的雜湊函式--function=md5
  • 使用較小的--chunk-size(例如 200)

或者,對受影響的表執行 ANALYZE TABLE 以重新計算其統計資訊。確保您了解在繁忙的伺服器上執行 ANALYZE TABLE 的影響。

引用自:https://dba.stackexchange.com/questions/151529