2016-04-15 3 views
1

Ich baue eine Immobilien-App. Ich habe eine Tabelle namens Eigenschaften, die wie die Haupttabelle ist, die alle üblichen Spalten (10 Spalten) für alle Arten von Eigenschaften (Länder, Wohnungen, ... usw.) hat und dann habe ich eine spezifische Tabelle für jeden Eigenschaftstyp seit jedem Typ hat eine bestimmte Spalte. hier ist die Eigenschaft Tabelle:Indexierungsspalten für schnellere Abfragen in MySQL 5.6 oder höher

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`) 
) 

und hier ist die Wohnungen zum Beispiel:

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); 

nun der Benutzer seine Suche basierend auf Filter kann fast jeder dieser Spalten oder eine Kombination von ihnen, so wie sollte ich meine Indexierungsstrategie auf die Spalten setzen (der Benutzer könnte basierend auf Preis, Fläche, Fläche und Preis, Anzahl der Schlafzimmer und des Standorts usw. mit diesen so vielen Kombinationen filtern) .. ein anderer Punkt ist, dass die property_description und property_title Texte sind also muss ich jedem einen Volltextindex hinzufügen, oder? es gibt auch eine Verbindung zwischen diesen beiden Tabellen und auch zwischen ihnen und einer anderen Tabelle (wie zum Beispiel Agenten Tabellen).

Ich habe einige sagen seit mysql 5.6 gibt es etwas im Optimierer, der mehrere Indizes verwendet, so können Sie einen Index auf jede Spalte setzen, aber ich weiß nicht, ob das richtig ist .. bitte beraten, da ich ' m nicht so gut in der Pflege der DB-Performance

+0

Es ist schwierig, wenn jede Spalte potenziell durchsuchbar ist, aber ich denke, Sie können damit beginnen, Ihre langsamsten Abfragen und auch die Spalten, die Joins in Ihren Abfragen ausmachen, als Kandidaten für einen nützlichen Index zu untersuchen. Darüber hinaus sind Volltextindizes in MySQL notorisch langsam und Sie sollten vielleicht in separate Indexer wie Sphinx und Solr schauen, die in MySQL integriert sind, um die Textsuche (und möglicherweise auch die geographische Suche) schnell zu verarbeiten. – Anton

+1

Verwenden Sie 'INT' nicht für' num_of_bathrooms'. Selbst die saudische Königsfamilie hat keine 4 Milliarden Badezimmer. Verwenden Sie 'TINYINT UNSIGNED' - 1 Byte (vs 4) und einen Bereich von 0..255. –

+1

8 Dezimalstellen ist genau genug lat/long, um zwei nebeneinander sitzende Roach-Motels zu unterscheiden. 'DECIMAL (6,4)/(7,4)' gibt Ihnen eine Auflösung von 16m/52ft, was ausreichen könnte. –

Antwort

0

5.7 hat JSON Tricks. MariaDB 10 hat dynamische Spalten mit ähnlichen Tricks.

Das Hauptprinzip: Expose die nützlicheren Felder; Werfen Sie die obskuren Felder in JSON- oder Dynamic-Spalten. Lassen Sie dann MySQL auf dem ersteren filtern, und Ihre App kümmert sich um weitere Filterung auf letzterem.

More discussion.

+0

habe ich nicht ganz verstanden .. Könnten Sie bitte mit einem Beispiel illustrieren oder wie man das in mysql macht (zB mit der Workbench)? thx^_^ –

+0

Zuerst lesen Sie bitte die Dokumentation zu diesen, und durchsuchen Sie dieses Forum nach dem Tag 'entity-attribute-value'. –

Verwandte Themen