データベースがクエリの頻度に基づいてテーブルを自動的にインデックス化しないのはなぜですか? データベースとそれが受け取るクエリを分析し、自動的に作成するか、少なくとも作成するインデックスを提案するツールはありますか?
特に MySQL に興味がありますが、他のデータベースにも興味があります。
これは、私がスタックオーバーフローで見た中で最高の質問です。残念ながら、私には答えがありません。Google の bigtable は適切な列に自動的にインデックスを付けますが、BigTable は任意の結合を許可しないため、問題の領域ははるかに小さくなります。
私ができる唯一の答えはこれです:
ある日、誰かが「なぜコンピューターは私のコードを分析し、最も頻繁に実行されるコードをコンパイルして静的に型付けできないのですか?」と尋ねました。
今日、人々はこの問題を解決しています (例: FF3.1 の Tamarin)。リレーショナル データベースの「自動インデックス作成」も同じクラスの問題だと思いますが、それほど優先事項ではありません。今から 10 年後、手動でデータベースにインデックスを追加することは時間の無駄と見なされるでしょう。今のところ、遅いクエリを監視し、オプティマイザーを実行することで立ち往生しています。
データベース オプティマイザーを有効にしたり、データベースに接続したりして、問題を解決する可能性のあるインデックスを提案 (場合によっては実行) することができます。
ただし、これは実際には些細な問題ではありません。これらの補助機能が最初に登場したとき、ユーザーは、最適化が不十分なためにデータベースの速度が実際に低下していることに気付くことがありました。
最後に、業界にはデータベース アーキテクトに多額の資金があり、彼らは現状維持を好みます。
それでも、データベースはよりインテリジェントになっています。Microsoft SQL サーバーで SQL サーバー プロファイラーを使用すると、サーバーを高速化する方法が見つかります。他のデータベースにも同様のプロファイラーがあり、この作業を行うサードパーティのユーティリティがあります。
しかし、クエリを書いているのであれば、適切なフィールドにインデックスを付けるために何をしているのかを十分に理解していることを願っています。そうでない場合は、適切なインデックスを使用することで問題が最も少なくなる可能性があります...
-アダム
MS SQL 2005 は、使用状況データに基づいて作成する推奨インデックスの内部参照も保持しています。Tuning Advisor ほど完全でも正確でもありませんが、自動的に実行されます。詳細については、dm_db_missing_index_groups を調べてください。
MS SQL ブログには、SQL 2005 でインデックスを提案するためのスクリプトが掲載されていると思いますが、正確なスクリプトは今のところ見つかりません。私が覚えているように、それは説明からのものです。詳細情報へのリンクは次のとおりです http://blogs.msdn.com/bartd/archive/2007/07/19/are-you-using-sql-s-missing-index-dmvs.aspx
PS SQL Server 2005 + のみ
このためのツールがあります。
MS SQL の場合は、SQL プロファイラー (データベースに対するアクティビティを記録するため) と、データベース エンジン チューニング アドバイザー (SQL 2005) またはインデックス チューニング ウィザード (SQL 2000) を使用してアクティビティを分析し、インデックスまたはその他の改善を推奨します。
はい、一部のエンジンは自動インデックス作成をサポートしています。mysql のそのような例の 1 つは Infobright です。そのエンジンは「従来の」インデックスをサポートせず、代わりに暗黙的にすべてにインデックスを付けます。これは列ベースのストレージ エンジンです。
このようなエンジンの動作は、開発者が期待するものとは大きく異なる傾向があります (もちろん、Infobright の使用を検討するのに開発者である必要はありません。標準エンジンのプラグイン代替ではありません)。
MySQLにはユーザーフレンドリーなプロファイラーがないようです。MySQLプロファイラーに基づくphpクラスであるこのようなものを試してみたいと思うかもしれません。
Amazon の SimpleDB では、使用状況に基づいてすべての列に自動インデックスが作成されます。
http://aws.amazon.com/simpledb/
ただし、他の制限があります。
10 GB の制限は、多くの人が想定しているよりも大きいため、大規模なヒットが発生した場合に書き換えを計画している単純なサイトについては、これを続行できます.
残念なことに、この種の自動インデックス作成は DynamoDb に組み込まれておらず、DynamoDb に取って代わられたようです。製品リストで SimpleDb について言及されていないため、古いリンクから見つける必要があります。
その理由の 1 つは、インデックスがわずかなスピードアップをもたらすだけではないということかもしれません。大きなテーブルに適切なインデックスがないと、クエリの実行が非常に遅くなり、アプリケーションがまったく使用できなくなり、他のソフトウェアとやり取りしている場合は、単に機能しなくなる可能性があります。したがって、アプリケーションの使用を開始する前に、インデックスを正しく設定する必要があります。
また、バックグラウンドでインデックスを構築し、構築中に処理をさらに遅くするよりも、大量のデータを追加する前にインデックスを定義しておくことをお勧めします。
サンプル クエリを取得し、どのインデックスが必要かを判断するツールがさらに増えることは間違いありません。また、おそらく最終的には、あなたが提案したとおりにパフォーマンスを監視し、必要と思われるインデックスを追加するデータベースを取得するでしょうが、正しいインデックスから始めることの代わりになるとは思いません.
Adam Davis のコメントに同意します。インデックスを自動的に作成するそのようなメカニズムが存在する場合、この機能に対する最も一般的な反応は、「それはいいですね。どうすればオフにできますか?」ということになるでしょう。
Google App Engineがそれを行います (index.yaml ファイルを参照)。