-Engine%2C%20MyISAM%20oder%20etwas%20anderes%20(z.%20B.%20MemCached).png)
Derzeit arbeite ich an einem Projekt, das sich um ein medizinisches Vokabular namens SNOMED dreht. Das Herzstück von SNOMED ist ein (relationaler) Datensatz mit 350.000 Begriffen/Datensätzen. Wir möchten diesen Datensatz schnell nach dem Dateneingabeteil abfragen können, für den wir eine Art automatische Vervollständigung/Vorschlagsfunktion wünschen.
Es befindet sich derzeit nur für Entwicklungszwecke in einer MySQL MyISAM-Datenbank, aber wir möchten mit einigen Speicheroptionen experimentieren. Es ist derzeit 30 MB groß, einschließlich der Indizes. Die MEMORY MySQL Engine und MemCached waren die offensichtlichsten, daher ist meine Frage, welche davon Sie vorschlagen würden oder ob es da draußen etwas Besseres gibt? Wir arbeiten hauptsächlich auf App-Ebene in Python, falls das einen Unterschied macht.
Randbemerkung: Der Datensatz verfügt über eine separate Relation, die diese Konzepte gängigen Aliasnamen und Abkürzungen zuordnet. Das sind etwa 1,3 Millionen Datensätze. Eventuell wollen wir hier auch eine Teilmenge davon verwenden.
Antwort1
Es ist nicht klar, was genau Ihre Anforderungen sind, aber bei einer so kleinen Datenbank werden Abfragen wahrscheinlich auf jeder Engine schnell sein, da alle Daten in den Speicher passen.
Dinge wie MyISAM und InnoDB erfordern einige Feineinstellungen, damit sie funktionieren. Memcached ist nur dann nützlich, wenn Sie auf sehr hohe lesebasierte Arbeitslasten skalieren müssen, also solche, die zu hoch sind, als dass ein einzelner Server sie aus einer herkömmlichen In-Memory-Datenbank heraus verarbeiten könnte (die Hauptfunktion von Memcached ist die Skalierbarkeit über einen Pool von Servern). Memcached kann jedoch keine herkömmlichen Abfragen wie Bereichsscans durchführen, sondern nur Nachschlagevorgänge für einen bestimmten Schlüssel. Es handelt sich also nicht um eine Allzweck-Datenbank.
Ich würde empfehlen, InnoDB mit einem Pufferpool zu verwenden, der größer ist als Ihr Datensatz, und Ihre Primärschlüssel richtig auszuwählen. Ein Primärschlüsselbereichsscan sollte sehr gut funktionieren und für Präfixvergleiche (z. B. Vervollständigungsfälle) verwendet werden können.
Damit können Sie auf normaler Hardware beispielsweise auf 1000 Abfragen pro Sekunde skalieren. Wenn Sie mehr benötigen, fügen Sie entweder Replikations-Slaves hinzu oder ziehen Sie etwas wie Memcached in Betracht.
Möchten Sie bei StackOverflow nachfragen?
Antwort2
Sie könnten die Tabelle als MEMORY-Typ behalten. Das wäre ziemlich schnell, allerdings müssten Sie sie vor der Verwendung mit einem Seed versehen. Ich habe das Gefühl, dass Sie damit viel Leistung erzielen könnten. Da sie im Speicher ist, ist sie bei Lesevorgängen sicherlich schneller als InnoDB und MyISAM.
Ich würde sagen, probieren Sie es auf verschiedene Arten aus und überlasten Sie die Suche dann mit ApacheBench, um zu sehen, was dem Druck am schnellsten nachgibt.