1

AUTO_INCREMENT列が制限に近づいていることを確認する bash スクリプトを作成するように割り当てられました。これを行う最善の方法は、「現在の自動インクリメント値」を取得し、「サポートされている列のデータ型の最大値」と比較することです(たとえば、 の場合は255 tinyint)。

データベースには約 2Tb のデータがありますが、時間がかかりすぎるため、INFORMATION SCHEMAテーブルをクエリして取得したくありません。AUTO_INCREMENT

したがって、両方ともテーブルをクエリするため、使用でき(SHOW TABLE STATUS LIKE 'table_name')ません。(SELECT AUTO_INCREMENT FROM information_schema.tables)INFORMATION SCHEMA

情報スキーマ テーブルにアクセスせずに現在の AUTO_INCREMENT を取得する回避策があるかもしれないと言われましたが、その方法はわかりません。何か案は?

これは私がデータ型を取得する方法です

DATA_TYPE="`$MYSQLCONNECT -D $DATABASE --batch -N -e "SELECT DATA_TYPE FROM         
INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '$DATABASE' AND TABLE_NAME='$TABLE' AND 
EXTRA='auto_increment'"`"

これは、列が処理できる最大値を取得する方法です。

MAX_VALUE="`$MYSQLCONNECT -D $DATABASE --batch -N -e "SELECT ( CASE '$DATA_TYPE' WHEN 'tinyint' 
THEN 255 WHEN 'smallint' THEN 65535 WHEN 'mediumint' THEN 16777215 WHEN 'int' THEN 4294967295 
WHEN 'bigint' THEN 18446744073709551615 END >> IF(LOCATE('unsigned', COLUMN_TYPE) > 0, 0, 1) ) 
as MAX_VALUE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '$DATABASE' AND TABLE_NAME 
= '$TABLE' AND EXTRA='auto_increment'"`"
4

1 に答える 1

1

TABLES または STATISTICS またはその他のテーブルに対するクエリにより、MySQL がテーブル内のデータ分布を分析したり、平均行サイズを計算したりするため、INFORMATION_SCHEMA のクエリには時間がかかります。

この分析のオーバーヘッドの量は、テーブルのサイズではなく、テーブルの数に関係しています。基本的に、各テーブルからランダムに 8 ページを読み取ります。

自動統計分析の機能を無効にして、I_S クエリがそれほどオーバーヘッドなく実行されるようにすることができます。

SET GLOBAL innodb_stats_on_metadata=0 

MySQL 5.6 では、これはデフォルトで構成されていますが、MySQL 5.1.7 以降では自分で行うこともできます。

参照: INFORMATION_SCHEMA の遅さの解決

FWIW、あなたがしていることを行うためのスクリプトも作成しました。MySQL と同じライセンスである GPL の下で提供します。これへのリンクは次のとおりです。
https://github.com/billkarwin/bk-tools/blob/master/pk-full-ratio.sql

自動インクリメントの主キー列だけでなく、すべての整数列に対して同様のスクリプトを作成しました:
https://github.com/billkarwin/bk-tools/blob/master/int-full-ratio.sql

于 2013-11-12T21:21:07.897 に答える