2017-04-25 6 views
0
CREATE TABLE IF NOT EXISTS `agenda` (
    `id_agenda` int(11) NOT NULL AUTO_INCREMENT, 
    `id_user` int(11) NOT NULL DEFAULT '0', 
    `id_customer` int(11) DEFAULT NULL, 
    `type` int(11) NOT NULL DEFAULT '8', 
    `title` varchar(255) NOT NULL DEFAULT '', 
    `text` text NOT NULL, 
    `start_day` date NOT NULL DEFAULT '0000-00-00', 
    `end_day` date NOT NULL DEFAULT '0000-00-00', 
    `start_hour` time NOT NULL DEFAULT '00:00:00', 
    `end_hour` time NOT NULL DEFAULT '00:00:00' 
    PRIMARY KEY (`id_agenda`), 
    KEY `start_day` (`start_day`), 
    KEY `id_customer` (`id_customer`), 
    KEY `id_user` (`id_user`), 
    KEY `type` (`type`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ; 

この種の状況を考えてみましょう:2百万のレコードと10人のアクティブユーザーを持つアジェンダテーブルを持つソフトウェア。アジダンステーブルのMysqlの最良インデックス

1)ユーザーのすべての予定のリスト:

は、ニーズのこの種をサポートするための最良の指標の設定は何ですか。

例:

SELECT * from agenda where id_user = '1'; 

2)その日のすべての予定のリスト、または週、または月。

例:

SELECT * from agenda where start_day = CURDATE(); 

3)顧客X.

例にリンクされているすべての予定のリスト:

SELECT * from agenda where id_customer = 'X'; 

4)におけるタイプYのすべての予定のリスト例えば1ヶ月。

例:

SELECT * from agenda where type='2' AND MONTH(start_day) = MONTH(CURDATE()); 

5)表題内部いくつかの文字列パターンを有するすべての予定のリスト。

例:

SELECT * from agenda where title LIKE '% closing %'; 

私はWHERE句、ORDER BY、GROUP BYの中で使用される各フィールドのインデックスを持っている悪い選択である文書の多くに読んだその原因を求めています...しかし、このようなニーズのために、どのように各フィールドのインデックスを避けることができますか? 複合インデックスでは、私はそれが正しい場合、私はインデックスの最初のフィールドを使用している場合、私は2番目のフィールドを使用することができます、それは正しいですか?

ありがとうございます。

+0

暫定的な「SELECT」ステートメントを入力してください。次に、最良のインデックスを作成することができます。 –

+0

私は私の仕事の中で見るいくつかの例を追加しました。 – Jung

+0

あなたは 'SELECT *'をしているのか、それとも数行を選んでいても問題ありません。 –

答えて

1
SELECT * from agenda where id_user = '1'; 
INDEX(id_user) 

SELECT * from agenda where start_day = CURDATE(); 
INDEX(start_day) 

SELECT * from agenda where id_customer = 'X'; 
INDEX(id_customer) 

この1

SELECT * 
    from agenda 
    where type='2' 
     AND MONTH(start_day) = MONTH(CURDATE()); 

良い製剤ではありません。

SELECT * 
    from agenda 
    where type='2' 
     AND start_day >= CONCAT(LEFT(CURDATE(), 7), '-01') 
     AND start_day < CONCAT(LEFT(CURDATE(), 7), '-01') + INTERVAL 1 MONTH; 

に変更し、この複合インデックス:INDEX(type, start_day)を追加してください。また、ちょうどtypeのインデックスを取り除く。それは役に立たないでしょう。

あるとしてこの1つは(理由リーディングワイルドカード)に最適化することができない。

SELECT * 
    from agenda 
    where title LIKE '% closing %'; 

しかしMATCH(title) AGAINST('+closing' IN BOOLEAN MODE)と共にFULLTEXT(title)インデックスは速くなるであろう。

More建物インデックス。

関連する問題