表スキーマ二つのテーブルについて最適化されたSQLクエリ
、CREATEクエリを以下に示す:
表1:(file_path_key、dir_path_key)
CREATE TABLE表1を(file_path_key varchar(500)、dir_path_key varchar(500)、主キー(file_path_key))エンジン= innodb;
例、file_path_key = /home/playstation/a.txt
dir_path_key = /ホーム/プレイステーション/
表2:(file_path_key、hash_key)
テーブルを作成しますテーブル2(file_path_key varchar(500)not null、hash_key )bigint(20)NULL以外の外部キー(file_path_key)の参照 テーブル1(file_path_key)on upd削除カスケードでカスケードを行った) エンジン= innodb;客観
:この特定のケースで
Given a hash value *H* and a directory string *D*, I need to find all those
hashes which equal to *H* from Table2, such that, the corresponding file entry
doesn't have *D* as it's directory.
は、表1には、周りに40,000のエントリを持っており、表2は、私の現在のクエリが本当に遅いなり5,000,000エントリを持っています。 s1が参加として
表1から別個s1.file_path_keyを選択S2としてs1.file_path_key = s2.file_path_keyとs1.dir_path_keyに(*ここhash_key表2 = Hから選択)= D!。
確かにあなたのキーの(潜在的な)サイズ助けにはならない。潜在的な鍵の範囲が必要ではないように見えます。参加する自動生成の主キーに切り替えることを検討しますか?これはあなたのテーブルのサイズをかなり減らすはずです。一つは、 'file_path_key'が単に' file'に変わる可能性があるということです(これは潜在的に不一致を減らすでしょう)。再帰的なCTEをサポートするRDBMSを使用していないのは残念です。これらは、フォルダ構造に対して完全に機能します。 –