Eine gute Antwort auf diese Frage finden Sie im DBA StackExchange: Ссылка
Wenn Sie den Primärschlüssel gruppieren, wird er in den Zeilen gespeichert. Dies bedeutet, dass es weniger Platz benötigt (da keine separaten Indexblöcke vorhanden sind). Der Hauptvorteil besteht jedoch darin, dass Bereichs-Scans im Allgemeinen auf Zeilen zugreifen können, die sich im selben Block befinden, wodurch IO-Vorgänge reduziert werden, was bei großen Datenmengen (nicht 50.000.000) sehr wichtig ist.
Ich denke, 50k ints ist ein eher künstlicher Maßstab und nicht einer, den Sie in der realen Welt interessieren.
[Nur als Idee]
Wenn Sie explizit angeben, dass Integerspalten als gruppierter Schlüssel verwendet werden sollen, wird genau das getan. Aber wenn Sie ihr sagen, dass sie Ihre Integer-Spalte nicht verwenden soll, erstellt sie immer noch einen Index hinter den Kulissen, wählt aber einen anderen Datentyp, um das zu tun, angenommen, doppelt so groß. Dann muss jeder dieser Einträge auf die Datensätze in der Tabelle verweisen und hier geht's los, die Größe explodiert.
Ich habe die insert-Anweisungen randomisiert und die Abfrage mit Werten von einer bis einer halben Million erneut durchgeführt. Interessanterweise nehmen sowohl die gruppierten als auch die nicht gruppierten db-Dateien nun genau den Platz ein (bis auf das Byte). Die Einfügungen in der gruppierten Datenbank sind jedoch noch schneller.
Für mich ist das gegensätzlich. Wenn ich dem Datenbankcluster diese Werte erzähle, sage ich der Datenbank ... diese Werte sollten besser in dieser Reihenfolge sein, wenn ich zurückkomme, um sie zu bekommen. Wenn ich nicht die Spezifikation habe, sage ich im Wesentlichen, dass der db - Look diese Werte annimmt und sie so anordnet, wie Sie möchten - was auch immer Ihr Leben einfacher macht.
Theoretisch sollte diese zusätzliche Freiheit die Abfragen niemals verlangsamen. Vielleicht nicht die ganze Zeit beschleunigen, aber niemals verlangsamen. Gedanken?
Tags und Links performance sqlite3 clustered-index