2017-02-24 2 views
-2

Ich habe eine MySQL-Tabelle mit Millionen von ZeilenSuchmaschine zu einer großen MySQL-Datenbank - php

und dies ist es info

id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
dob date NOT NULL, 
name VARCHAR(32) NOT NULL, 
age VARCHAR(2) NOT NULL, 
country VARCHAR(25) NOT NULL, 
phone VARCHAR(32) NOT NULL, 
city VARCHAR(32) NOT NULL, 
comment tinytext NOT NULL, 

was ich ia Suchmaschine mit dieser Abfrage

tun will
SELECT * FROM dbname 
    WHERE name LIKE '%$var%' 
     AND (age = '$age' 
     AND phone = '$phone' 
     AND country = '$country' 
     AND city = '$city') 

ist diese Abfrage gut für die Leistung? oder was soll ich verwenden? .. Wie ich schon sagte, bevor die Tabelle sehr groß ist und enthält Millionen von Zeilen

und zu vielen Benutzer diese Abfrage pro Tag

dank Beratung verwenden,

+1

Versuchen Sie, die Abfrage auf Ihrem Server auszuführen, und sehen Sie selbst, ob die benötigte Zeit Ihren Anforderungen entspricht. Wenn dies nicht der Fall ist, versuchen Sie, die EXPLAIN-Abfrage auszuführen, um weitere Informationen zu erhalten. – NaeiKinDus

Antwort

0

Bitte lernen, den technischen Unterschied zwischen ‚Datenbank‘ und "Tisch". Die meisten dieser Diskussionen befassen sich mit "Tabellen", nicht mit "Datenbanken". (Eine 'Datenbank' ist eine Sammlung von 'Tabellen'; eine 'Tabelle' enthält Daten in Zeilen und Spalten.)

Normalisieren oder abkürzen country. Die 2-Buchstaben-Codes sind gut. Dann deklariere die Spalte

country CHAR(2) CHARACTER SET ascii 

age VARCHAR... ?? Verwenden Sie TINYINT UNSIGNED, es ist viel kleiner. Oder ... Berechne es, da du die dob hast.

TINYTEXT hat einige subtile Probleme; Verwenden Sie das Äquivalent VARCHAR(255).

Geburtsdatum gilt als vertrauliche Information; überdenken Sie, ob Sie solche sammeln und aufbewahren sollten.

"Millionen von Zeilen" gilt nicht als "riesig". Aber du brauchst einen Index.

LIKE mit einem führenden Platzhalter kann keinen Index verwenden, daher werde ich den Filter name ignorieren.

Sie haben 4 weitere Spalten AND d zusammen - ein einzelner Index in einem oder allen von ihnen wäre sehr nützlich.

Da phone wahrscheinlich ist sehr selektiv sein, Sie ein einfaches

INDEX(phone) 

haben könnte und dass SELECT würde sehr schnell laufen.

Es gibt keine Notwendigkeit, noch Leistungsvorsprung in irgendeiner Form, Partitionierung oder sharding für diese Tabelle und Abfrage.