2016-04-15 26 views
1

私は不動産アプリを開発しています。私はすべてのタイプのプロパティ(土地、アパート、...など)のすべての共通の列(10列)を持っているメインテーブルのようなプロパティと呼ばれるテーブルを持っているし、各タイプいくつかの特定の列を持っています。今、ユーザーがほぼすべてのこれらの列のまたはそれらの組み合わせに基づいて彼の検索をフィルタリングすることができMySQL 5.6以降でクエリを高速化するためのインデックスカラム

CREATE TABLE `apartments` (
    `apartment_id` INT NOT NULL COMMENT '', 
    `num_of_bedrooms` INT NULL COMMENT '', 
    `num_of_bathrooms` INT NULL COMMENT '', 
    `num_of_garages` INT NULL COMMENT '', 
    PRIMARY KEY (`apartment_id`) COMMENT '', 
    CONSTRAINT `properties_apartments_fk` 
    FOREIGN KEY (`apartment_id`) 
    REFERENCES `aqar_world`.`properties` (`property_id`) 
    ON DELETE CASCADE 
    ON UPDATE NO ACTION); 

ので、どのように:

CREATE TABLE `properties` (
    `property_id` int(11) NOT NULL AUTO_INCREMENT, 
    `property_type` int(11) DEFAULT NULL, 
    `property_title` varchar(255) NOT NULL, 
    `property_description` varchar(1000) NOT NULL, 
    `country_id` int(11) NOT NULL, 
    `city_id` int(11) NOT NULL, 
    `city_location_id` int(11) NOT NULL, 
    `price` int(11) DEFAULT NULL, 
    `area` decimal(7,2) DEFAULT NULL, 
    `latitude` decimal(10,8) DEFAULT NULL, 
    `longitude` decimal(11,8) DEFAULT NULL, 
    `entry_date` datetime NOT NULL, 
    `last_modification_date` datetime NOT NULL, 
    PRIMARY KEY (`property_id`) 
) 

、ここでは、例えばアパートです:ここでプロパティテーブルがあります列にインデックス作成戦略を置く必要があります(ユーザーは価格、面積、面積、価格、寝室と場所の数などに基づいてフィルタリングできます)。もう一つのポイントは、property_descriptionとproperty_titleはテキストですだから私はそれらのそれぞれに全文索引を追加しなければならないでしょうか?また、これらの2つのテーブルの間、およびそれらと他のテーブル(たとえば、エージェントテーブルなど)の間に結合が存在します。

私はmysql 5.6からオプテ​​ィマイザに複数のインデックスを使用する何かを読んだことがあるので、各列にインデックスを付けることができますが、それが正しいかどうかわかりません。 DBのパフォーマンスの世話をするにはそれほど良くありません

+0

すべての列が潜在的に検索可能な場合は難しいですが、最も遅いクエリとクエリの結合を構成する列を有用なインデックスの候補として調べることから始めてください。さらに、フルテキスト索引はMySQLでは非常に遅く、SphinxやSolr(MySQLと統合されている)などのインデクサーを探して、テキスト検索(および場合によっては地理的検索も)を素早く処理することができます。 – Anton

+1

'num_of_bathrooms'に' INT'を使用しないでください。サウジ王室でさえ、40億のバスルームはありません。 'TINYINT UNSIGNED'を使う - 1バイト(vs 4)と0..255の範囲。 –

+1

小数点以下8桁は、隣に座っている2つのローチモーテルを区別するのに十分な緯度/経度です。 'DECIMAL(6,4)/(7.4)'は16m/52ftの解像度を提供します。 –

答えて

0

5.7にはJSONのトリックがあります。 MariaDB 10には、同様のトリックを持つDynamic Columnsがあります。

主な原則:より有用なフィールドを公開する。よりわかりにくいフィールドをJSONまたはDynamicカラムに投げます。その後、前者をMySQLフィルタにすると、アプリケーションは後者のフィルタリングをさらに処理します。

More discussion

+0

私はあまり理解できませんでした。例を挙げて説明するか、mysqlで(ワークベンチを使用して)行う方法を説明してください。 thx^_^ –

+0

まず、それらのドキュメントを読んでください。さらに、このフォーラムで 'entity-attribute-value'タグを検索してください。 –

関連する問題