1

次のように記述されたレストランのMySQLテーブルがあります。

 CREATE TABLE `restaurants` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(32) NOT NULL,
    `description` varchar(512) NOT NULL,
    `tags` varchar(512) DEFAULT NULL,
    `type` enum('A','D','E','L','Q','R','P','T','Z') NOT NULL,
    `popularity` int(11) DEFAULT '0',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uc_type_name` (`type`,`name`),
    KEY `name_idx` (`name`),
    KEY `type_popularity_idx` (`type`,`popularity`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

テーブルに関するステータス情報を次に示します。

Name: restaurants
    Engine: MyISAM
    Version: 10
    Row_format: Dynamic
    Rows: 72999
    Avg_row_length: 84
    Data_length: 6204488
    Max_data_length: 281474976710655
    Index_length: 5280768
    Data_free: 0
    Auto_increment: 75634
    Collation: utf8_general_ci
    Checksum: NULL
    Create_options:
    Comment:

特定のレストラン タイプの特定の用語に一致する 6 つの最も人気のあるレストランを返すクエリを作成しようとしています。

SELECT `id`, `name`, `type`, `description` FROM `restaurants` 
WHERE `type` = 'A'
      AND (`name` LIKE '%some restaurant%'
           OR `description` LIKE '%some restaurant%' 
           OR `tags` LIKE '%some restaurant%')
ORDER BY `popularity` DESC
LIMIT 6

レストラン タイプの 1 つである A には、61,500 のレストランが含まれています。さらに、これらの A タイプのレストランには、比較的長い説明と名前が付けられていることがよくあります。したがって、タイプ A のルックアップの結果がない場合、クエリには 0.8 ~ 0.9 秒かかります。ただし、結果がある場合は、0.1 秒という速さで実行されます。

このクエリのパフォーマンスを高速化するにはどうすればよいですか?

4

1 に答える 1

1

フルテキストインデックスを使用してみることができます:

ALTER TABLE `restaurants` ADD FULLTEXT (`name`, `description`, `tags`);

使用MATCH

SELECT `id`, `name`, `type`, `description` FROM `restaurants` 
    WHERE `type` = 'A'
        AND MATCH (`name`, `description`, `tags`) AGAINST ('some restaurant')
    ORDER BY `popularity` DESC LIMIT 6

また、実行します

EXPLAIN SELECT `id`, `name`, `type`, `description` FROM `restaurants` 
    WHERE `type` = 'A'
        AND MATCH (`name`, `description`, `tags`) AGAINST ('some restaurant')
    ORDER BY `popularity` DESC LIMIT 6

インデックスが使用されているかどうかを確認します。

テストするだけで役立つかどうかを確認できます。LIKEと全文検索のパフォーマンスは、環境とテーブル構造によって大きく異なります...少なくともテーブル全体を検索するわけではありません。

于 2012-10-29T21:20:38.827 に答える