10

MySQL を使用する電子商取引アプリケーションがあり、より高速にしたいと考えています。以前にアクセスしたことのある Web サイトでパーツ # にアクセスすると、必要なすべてのデータが既に INNODB バッファー プールにあるため、パーツがすばやく読み込まれます。ただし、パーツ # が以前にロードされたことがない場合、そのデータはまだバッファー プールにないため、ディスクから読み取る必要があり、低速です。INNODB バッファー プールを 2GB に設定しました。このデータベース全体は約 350MB しかないため、データベース全体をバッファー プールにロードする十分な余裕があります。INNODB の統計から、現在バッファ プールの約半分しか使用されていないことがわかります。

データのプリロード (バッファー プールの "ウォームアップ" とも呼ばれる) に関する参照を見つけました。たとえば、バッファー プール内の Innodb テーブルをすばやくプリロードする、または mysqldump.azundris.com/archives/70-Innodb-cache-preloading- などです。使用-blackhole.html。MySQL にはデータをプリロードするためのネイティブな方法がないため、戦略には基本的に各テーブルでテーブル スキャンを強制することが含まれます。

データベース内のすべてのテーブルをリストするスクリプトを手動で作成したくないので、これを行う必要があります。テーブルスキャンが実行されるように、各テーブルを自動的に通過して選択し、インデックスのない列を自動的に選択するスクリプトを作成するにはどうすればよいですか?

4

2 に答える 2

27

これにより、実行するクエリのリストが表示されます;)

SELECT 
  CONCAT('SELECT ',MIN(c.COLUMN_NAME),' FROM ',c.TABLE_NAME,' WHERE ',MIN(c.COLUMN_NAME),' IS NOT NULL')
FROM
  information_schema.COLUMNS AS c
LEFT JOIN (
  SELECT DISTINCT
    TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME
  FROM
    information_schema.KEY_COLUMN_USAGE
) AS k
USING
  (TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME)
WHERE
  c.TABLE_SCHEMA = 'yourDatabase'
  AND k.COLUMN_NAME IS NULL
GROUP BY
  c.TABLE_NAME

それをストアドプロシージャに入れ、カーソルで結果セットを調べることができます。各行から準備済みステートメントを作成し、実行します。

于 2010-08-07T15:33:21.853 に答える
0

このクエリはデータベース内のテーブル名を返すため、手動で入力する必要はありません。

SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'database name'

次に、テーブル名ごとにテーブルスキャンを強制します。

于 2010-08-07T15:05:56.293 に答える