私は不動産アプリを開発しています。私はすべてのタイプのプロパティ(土地、アパート、...など)のすべての共通の列(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のパフォーマンスの世話をするにはそれほど良くありません
すべての列が潜在的に検索可能な場合は難しいですが、最も遅いクエリとクエリの結合を構成する列を有用なインデックスの候補として調べることから始めてください。さらに、フルテキスト索引はMySQLでは非常に遅く、SphinxやSolr(MySQLと統合されている)などのインデクサーを探して、テキスト検索(および場合によっては地理的検索も)を素早く処理することができます。 – Anton
'num_of_bathrooms'に' INT'を使用しないでください。サウジ王室でさえ、40億のバスルームはありません。 'TINYINT UNSIGNED'を使う - 1バイト(vs 4)と0..255の範囲。 –
小数点以下8桁は、隣に座っている2つのローチモーテルを区別するのに十分な緯度/経度です。 'DECIMAL(6,4)/(7.4)'は16m/52ftの解像度を提供します。 –