• 締切済み

検索インデックスの書き方

Mysqlの検索用のインデックスの書き方を調べているのですが、なかなか見つかりません。 テーブル、customersを作成して、その中に、項目として、 `email` varchar(100) default NULL を定義した場合、 インデックスの付与として、 KEY `idx_customers_email` (`email`) と書いた場合と、 FULLTEXTインデックスの付与として FULLTEXT KEY `email` (`email`) と書いた場合、何が違うのでしょうか? また、このあたりの詳しい説明が載っているサイトとかあれば是非教えてください。

  • MySQL
  • 回答数1
  • ありがとう数10

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

むしろ全文検索とは何か理解されていないなら FULLTEXT INDEXを設定することはまずないでしょう InnoDBとか対応していないし・・・ 全文検索自体は半角スペースで分かち書きされた文書(一般に英語の長文)の 特定のキーワードに高速にヒットさせるものなので、日本語との相性はわるく そもそもemailの検索としても適切だとはいえないのでこのケースでは 使うことはないでしょう。 慣れるまでは通常インデックスのみの運用で問題ないと思いますし おそらくよほど使いこなす人以外は一生使わない機能の一つだと思いますよ。

関連するQ&A

  • postgres table作成時にindex付与

    MySQLでは以下のようにテーブル作成時にインデックス付与ができます。 CREATE TABLE test ( a int(11) NOT NULL DEFAULT '0', b int(11) DEFAULT NULL, PRIMARY KEY (a), KEY test_idx (b), -- ★インデックス その1 KEY test_idx2 (a) -- ★インデックス その2 ); ポスグレではできませんか?

  • mysqlのインデックスについて質問です。

    mysqlのインデックスについて質問です。 http://archiva.jp/web/server-side/sql_02.html に、 『mysqlでは1つのクエリ実行で、1つのテーブルにつき1つのインデックスしか使用できない』 とあります。 よく以下のようなテーブル定義を見かけますが、 CREATE TABLE IF NOT EXISTS `data` ( `id` int(10) NOT NULL default '0', `user_id` int(10) NOT NULL default '0', `file_id` int(10) NOT NULL default '0', `name` text collate utf8_unicode_ci NOT NULL default '', PRIMARY KEY (`id`), KEY `user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; idとuser_idを条件にするクエリであれば、上記制約を満たすため、 KEY `id_user_id_idx` (`id`,`user_id`) の複合クエリを定義すれば良いのでしょうか? また、idとuser_idとfile_idを条件にするクエリも考慮に入れた場合、 テーブル定義は以下のようにするのでしょうか? CREATE TABLE IF NOT EXISTS `data` ( `id` int(10) NOT NULL default '0', `user_id` int(10) NOT NULL default '0', `file_id` int(10) NOT NULL default '0', `name` text collate utf8_unicode_ci NOT NULL default '', PRIMARY KEY (`id`), KEY `user_id` (`user_id`), KEY `id_user_id_idx` (`id`,`user_id`), KEY `id_user_id_file_id_idx` (`id`,`user_id`,`file_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 最後に、create table 時のインデックスの指定は、 INDEX `user_id` (`user_id`), のようにもできますが、INDEXとKEYの違いは何かあるのでしょうか。

    • ベストアンサー
    • MySQL
  • 効率的なインデックスのつけ方は?

    効率的なインデックスのつけ方は? MYSQLでのインデックスのつけ方をご教授して頂けますでしょうか? ・データ数とかその他もろもろにもよるかと思いますが、一般的に考えてってことでよろしくお願いいたします。 以下のようなテーブル定義があったとします。 CREATE TABLE TEST_TBL ( C1 VARCHAR(10) NOT NULL, C2 VARCHAR(10) NOT NULL, C3 VARCHAR(10) NOT NULL, C4 VARCHAR(10) NOT NULL, PRIMARY KEY (C1) ) 検索条件としては、 ・(C1) ・(C2) ・(C3) ・(C4) ・(C1,C2) ・(C1,C3) ・(C1,C4) ・(C2,C3) ・(C2,C4) ・(C3,C4) ・(C1,C2,C3) ・(C1,C2,C4) ・(C1,C3,C4) ・(C2,C3,C4) ・(C1,C2,C3,C4) と言うような、すべての場合の条件があるとします。 それぞれの検索条件の頻度は同程度とします。 この場合、どのINDEXとどのINDEXを作成するがベターなのでしょうか? 1. CREATE INDEX TEST_IDX1 ON TEST_TBL (C1); 2. CREATE INDEX TEST_IDX1 ON TEST_TBL (C2); 3. CREATE INDEX TEST_IDX1 ON TEST_TBL (C3); 4. CREATE INDEX TEST_IDX1 ON TEST_TBL (C4); 5. CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C2); 6. CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C3); 7. CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C4); 8. CREATE INDEX TEST_IDX1 ON TEST_TBL (C2,C3); 9. CREATE INDEX TEST_IDX1 ON TEST_TBL (C2,C4); 10.CREATE INDEX TEST_IDX1 ON TEST_TBL (C3,C4); 11.CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C2,C3); 12.CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C2,C4); 13.CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C3,C4); 14.CREATE INDEX TEST_IDX1 ON TEST_TBL (C2,C3,C4); 15.CREATE INDEX TEST_IDX1 ON TEST_TBL (C1,C2,C3,C4);

    • ベストアンサー
    • MySQL
  • AUTO_INCREMENTのあるテーブルにinsertできません(長文)

    mysql5.0.27(RedhatLinux 9)です。 属性のひとつがAUTO_INCREMENTになっているテーブルhogeに、データをinsertしたいのですが、「コラムの数が合致しない」というエラーで、insertできません。 Webをいろいろ漁って、AUTO_INCREMENTの属性は明示的に指定しないようだと理解しました。冗長で申し訳ないのですが、エラーが出た状態のものを、そのまま掲載させていただきます(テーブル名や属性名のみ変更しました)。 状態をまとめると、以下のようになります。 ・下記のテーブル定義で、テーブルは普通にcreateできた。 ・descで確認しても、ちゃんとテーブルはできているよう。 ・下記のinsert文で、その下のエラーメッセージが出て、データを登録できない。 ・どうみても、コラム数は合っている(と思う)。 ・下記のテーブル定義の属性数を適当に減らす(id, item1, item4, item6くらいにする)と、エラーが出ずデータがちゃんとinsertできる。 私はなにか、とんてもない勘違いをしているのでしょうか?かなりの時間試行錯誤しているのですが、一向にわかりません。。。 ===== テーブル定義 ===== CREATE TABLE hoge ( id MEDIUMINT UNSIGNED AUTO_INCREMENT NOT NULL, item1 VARCHAR (64) NOT NULL, item2 VARCHAR (64) NOT NULL, item3 VARCHAR (32) NOT NULL, item4 VARCHAR (64), item5 VARCHAR (64), item6 VARCHAR (16) NOT NULL, CONSTRAINT PK_HOGE PRIMARY KEY (id) ) type=innodb; CREATE INDEX IDX_HOGE_1 ON hoge(item1); CREATE INDEX IDX_HOGE_2 ON hoge(item2); CREATE INDEX IDX_HOGE_3 ON hoge(item3); CREATE INDEX IDX_HOGE_4 ON hoge(item4); CREATE INDEX IDX_HOGE_5 ON hoge(item6); ===== descの出力 ===== +---------------------+-----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------------+-----------------------+------+-----+---------+----------------+ | id | mediumint(8) unsigned | NO | PRI | NULL | auto_increment | | item1 | varchar(64) | NO | MUL | | | | item2 | varchar(64) | NO | MUL | | | | item3 | varchar(32) | NO | MUL | | | | item4 | varchar(64) | YES | MUL | NULL | | | item5 | varchar(64) | YES | | NULL | | | item6 | varchar(16) | NO | MUL | | | +---------------------+-----------------------+------+-----+---------+----------------+ 7 rows in set (0.00 sec) ===== insert文 ===== insert into hoge (item1, item2, item3, item4, item5, item6) values ( 'data1','data2', 'data3', 'data4', 'data5', 'data6'); ===== エラーメッセージ ===== ERROR 1136 (21S01) at line 1: Column count doesn't match value count at row 1 長文大変申し訳ありません。よろしくお願いします。

  • ForeignKeyの作成方法について

    MySQLでForeign Keyを作成しようと、以下のSQLを実行したところ、 テーブルは作成されず、エラーが発生しました。 エラーメッセージは  Can't create table 'test.user' (errno: 150) です。 また、 INDEX (CompanyID), FOREIGN KEY (CompanyID) REFERENCES m_Company(CompanyID), の2行を外すと通常通りテーブルは作成できます。 どうやったら、Foreign Keyを設定できるでしょうか。 テーブル作成後に、後付でForeign Keyを設定しようと心みましたが、 それも失敗しました。 -------------------------------------------------------- CREATE TABLE user ( `Seqno` int(11) NOT NULL AUTO_INCREMENT, `UserID` varchar(8) NOT NULL DEFAULT '', `Password` varchar(8) DEFAULT NULL, `Mail` varchar(100) DEFAULT NULL, `Valid` tinyint(4) DEFAULT NULL, `CompanyID` int(11) DEFAULT NULL, INDEX (CompanyID), FOREIGN KEY (CompanyID) REFERENCES m_Company(CompanyID), PRIMARY KEY (`Seqno`,`UserID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; --------------------------------------------------------

    • ベストアンサー
    • MySQL
  • インデックスについて

    宜しくお願いします。 MySQLで検索速度を上げる為にカラム毎に設定するINDEXですが、 fulltextとindexの2種を使えば、全カラムにINDEXを付けられると思いますが、検索するか分からないカラムにもINDEXをつけた場合、何か不都合がおこりますか? 例えば、INDEXが多すぎると逆に検索が遅くなるなどです。 ちなみに、fulltextは日本語に対応していないのは理解しております。

    • ベストアンサー
    • MySQL
  • テーブル定義書作成時のIndex付加について

    基礎的なことで申し訳ございませんが、 お力添えよろしくお願いいたします。 CentOs 5 & PostgreSQL 8.4.9にてDB構築しております。 DB構築から、テーブル作成・項目追加・キー設定まで行いまして、 検索する際に、抽出件数が多く負荷のかかりそうなものに Indexを作成しようと考えております。 ■本題  1.Indexを作成する対象となる項目の、目安としてどのようなものが考えられるでしょうか。   ・キー対象の項目になっているもの   ・検索条件の対象となる項目なども当たるでしょうか  2.項目をまとめて一つのIndexにするメリット・デメリットはどのようなものでしょうか   3.テーブル結合したときのIndexの動作    例) 下記のようなテーブルがあった場合 tablea(データ50000件程度) hoge_id pkey1 hoge_no hoge_nm ... tableb(データ150000件程度) test_id pkey1 hoge_id pkey2 hoge_betu_kb ...     select t1.hoge_id, t1.hoge_nm, t2.hoge_betu_kb rom tablea as t1 leftjoin tableb as t2 on t1.hoge_id = t2.hoge_id where t1.hoge_id > '100' and t1.hoge_nm like 'あいう%'   このような場合のIndex作成は、 A. Create index idx_tablea_hoge_id ON tablea (hoge_id); B. Create index idx_tablea_hoge_id ON tablea (hoge_nm); C. Create index idx_tableb_hoge_id ON tableb (hoge_id); ←tableaで指定しているのでこれは不要?  4.A.B.C.のようなIndex作成した際のテーブル定義の書き方   テーブル定義書のフォーマットは定められており、お門違いな質問かとは存じてはおりますが、   テーブル定義にIndex定義を書く場合に、添付した画像のようなフォーマットの書き方が   よく理解できずお気づきの点などございましたら、ご指摘願えたら助かります。   (以前は、CSEツールなどで自動出力される定義書のような書き方をしていたもので・・・)         例)tablea IDX1 IDX2 IDX3 hoge_id 1 hoge_nm 2 このような書き方になるのかどうか?      IDX2, IDX3の項目とは?どのようなIndex定義をした際に書き込むことになるのかが判らず。。。      基礎から勉強しなおすべきとは存じておりますが。。。 現状の期間あまり時間がないことと、 DB構築を一人で行っており、このような内容を相談できるものがおりませんゆえ、 改めて、Index付加することを考えてみると、いまさら聞けないような内容かもしれませんが ちゃんと把握したうえで、テーブル構築したいと思いますので 今までの他の皆様の経験からのノウハウなども踏まえて、 ご教授いただけると大変助かります。

  • ユニークインデックスについて

    仕事の関係で、テーブル定義の際にユニークインデックスをどの列の組み合わせにするのか考える必要があるのですが、今までユニークインデックスの存在自体知らず、困っています。 自分自身でネット等で調べた結果以下のことは理解できました。  1.ユニークインデックスで指定された列は値が一意でなければならない。  2.主キーの列にはNULL値は不可だが、ユニークインデックスの列はNULL値も可。  3.主キーは一つのテーブルにつき、一つしか設定できないが、    ユニークインデックスは複数設定できる。(同じ列は指定できない)  4.主キー設定時、実は暗黙的にユニークインデックスとNOT NULL制約が作成されている。 ここまでは分かったのですが、主キーとは別で、明示的にユニークインデックスを指定する必要性とはなんなのでしょうか? 主キーとは別で明示的に指定した方が良い場合と、その実例をどなたか教えて頂けないでしょうか? よろしくお願いします。

  • インデックスの作成

    インデックスを複数作成する理由がわかりません。 TESTテーブルにA,B,C,Dという項目があった場合、 TEST_IDX(A,B,C,D)のように作ってしまえば、いずれの 項目にもインデックスが貼られているので、それでOK というわけにはいかないのでしょうか? 例えばインデックスを 1.TEST_IDX_1(A,B) 2.TEST_IDX_2(B,C) 3.TEST_IDX_3(D) のように作成する理由とは何でしょうか?

  • インデックスの作り方

    MySQL4.1.19を使っているのですが、ユニークなインデックスの作り方で困っています。 例えば、 create table dttest ( a int NOT NULL , b int NOT NULL , c int NOT NULL , d int NOT NULL , CONSTRAINT PK_dttest PRIMARY KEY ( b ) ) type=InnoDB; というテーブルがあったとして、 aフィールドはユニークのインデックスを作り cフィールドは、重複可能なインデックスを作りには どうすればよいのでしょうか? 初歩的な質問で申し訳ありませんが、 よろしくお願いします。

    • ベストアンサー
    • MySQL