Angenommen, ich habe eine Benutzertabelle auf meiner Site, in der sich ungefähr 2-3 Millionen Benutzer (Datensätze) in der Tabelle befinden.
Um meinen Anmeldevorgang zu beschleunigen, ist es ein guter Ansatz, meine Benutzertabelle zu teilen, eine für ihre Informationen und eine für ihre Anmeldung.
Wenn wir eine Abfrage ähnlich der folgenden aus einer Tabelle ausführen können:
select username,password from users where username=`test` AND password=****
Ist es notwendig, es zu teilen, und beschleunigt dies den Anmeldevorgang meiner Site?
Antworten:
IMHO Sie müssen es nicht physisch aufteilen. Es wäre jedoch schön, es zwischenzuspeichern.
Wenn die
users
Tabelle die MyISAM Storage Engine verwendet, haben Sie einen schönen Vorteil.Da MyISAM nur Indizes zwischenspeichert, können Sie zwei Dinge tun
users
Tabelle zu ladenStellen Sie sicher, dass die folgenden Indizes für vorhanden sind
users
Es gibt zwei (2) Hauptgründe für die beiden Indizes
GRUND für Index # 1
Der Index
username_ndx
verhindert, dass ein Benutzername mehrere Kennwörter hat, und verhindert, dass mehrere Benutzer denselben Namen habenGRUND für Index # 2
Der Index
username_password_ndx
bietet einen Deckungsindex . Daher sucht Ihre Abfrage nur den Benutzernamen und das Kennwort im benutzerdefinierten MyISAM-Cache, anstatt die Tabelle zu überprüfen.Weitere Links zu den Grundsätzen der Indexabdeckung
Als Nächstes müssen Sie diesen benutzerdefinierten Schlüsselcache erstellen. Hier sind die Befehle zum Erstellen eines 8-MB-Schlüsselcaches und zum Laden dieses dedizierten Schlüsselcaches (Beispiel: Wenn die Tabelle vorhanden ist
mydb.users
):Sie sollten diese drei Zeilen in die Datei /var/lib/mysql/startup.sql einfügen
Fügen Sie dies zu /etc/my.cnf hinzu
Dadurch wird der Cache jedes Mal geladen, wenn MySQL gestartet wird
Versuche es !!!
UPDATE 30.12.2011 17:25 EDT
Wenn Sie die genaue Größe zum Festlegen des Caches erhalten möchten, verwenden Sie die folgende Abfrage:
UPDATE 30.12.2011 23:21 EDT
Hier ist eine Methode, die auf InnoDB basiert
Sie benötigen noch die Indizes
Sie müssen sicherstellen, dass im InnoDB-Pufferpool die Benutzernamen und Kennwörter verfügbar sind. Möglicherweise müssen Sie beim Start von MySQL einen vollständigen Index-Scan durchführen:
Schritt 1) Erstellen Sie ReadUserPass.sql
Schritt 2) Fügen Sie dieses Skript zu /etc/my.cnf hinzu
Schritt 3) Führen Sie einen der folgenden Schritte aus
$ service mysql restart
mysql> source /var/lib/mysql/ReadUserPass.sql
Da sich beide Spalten (Benutzername und Kennwort) in der befinden
username_password_ndx
, werden alle Indexseiten, aus denen dieser Index besteht, erneut in den InnoDB-Pufferpool geladen. Dies ist erforderlich, da die Indexseiten möglicherweise gelöscht werden. Um dies zu minimieren, erhöhen Sie die Größe des Pufferpools und starten Sie mysql neu (einmalig).quelle
users
Tabelle an Transaktionen beteiligt ist, muss ich eine andere Antwort einreichen, die ausschließlich auf InnoDB basiert.Eine Tabelle mit ein paar Millionen Zeilen sollte nicht aufgeteilt werden müssen. Die Leistungsoptimierung sollte über Indizes erfolgen. In MySpace waren Hunderte Millionen Konten in einer einzigen Tabelle aufgeführt, und die Leistung in dieser Tabelle war in Ordnung. (Ich war ein DBA für MySpace auf dem Höhepunkt ihrer Nutzung.) Die Tabelle war in diesem Fall wahrscheinlich 80-90 Byte breit (vielleicht etwas mehr).
quelle
Haben Sie tatsächlich 2 Millionen Benutzer? Sofern Sie dieses Problem nicht bereits haben oder sicher sind, dass Sie es tun werden, optimieren Sie weit im Voraus. Fügen Sie einen zusammengesetzten Index für Anmelde- und Kennwortfelder hinzu und fertig. Optimieren Sie nur, wenn Sie wissen, dass Sie tatsächlich ein Problem zu lösen haben. Ich bin sicher, Sie haben größere Probleme zu lösen.
quelle
Wenn Sie MySQL 5.1 und höher verwenden, können Sie versuchen , Ihre Tabelle zu partitionieren .
Bei Ihrer Frage, ob der Anmeldevorgang beschleunigt wird, hängt es davon ab, wie der Rest des Anmeldevorgangs aussieht (wenn Ihre Abfrage beispielsweise jetzt 0,05 Sekunden dauert und der Rest des Codes 20 Sekunden dauert, würde ich lieber erneut denke die ganze Routine ...).
Vergessen Sie auch nicht, unabhängig von der Verwendung von Partitionen Indizes hinzuzufügen, wie RolandoMySQLDBA hervorhob .
quelle