Heim  >  Artikel  >  Datenbank  >  MySQL-Optimierung (1) Tabellenoptimierung und Auswahl des Spaltentyps

MySQL-Optimierung (1) Tabellenoptimierung und Auswahl des Spaltentyps

黄舟
黄舟Original
2016-12-29 16:04:131208Durchsuche

Tabellenoptimierung:

1: Trennung von fester Länge und variabler Länge

Zum Beispiel belegt id int 4 Bytes, char(4) belegt 4 Zeichen und hat ebenfalls eine feste Länge ,
Zeit bedeutet, dass die von jedem Einheitswert belegten Bytes fest sind.

Kern- und häufig verwendete Felder sollten auf eine feste Länge aufgebaut und in einer Tabelle platziert werden,
Text, Blob , Diese Art von Feld variabler Länge eignet sich zum Platzieren in einer einzelnen Tabelle und zum Verknüpfen mit dem Primärschlüssel mit der Kerntabelle

SQL überspringt 100.000 Daten sehr schnell, da alle konstant sind

2: Häufig verwendete Felder und ungewöhnliche Felder sollten getrennt werden.

Es muss basierend auf dem spezifischen Geschäft der Website analysiert werden, und die Abfrageszenarien der Felder sollten analysiert werden Niedrige Abfragehäufigkeit sollte einzeln getrennt werden.

3: Fügen Sie redundante Felder zu 1-zu-vielen-Feldern hinzu, die verwandte Statistiken erfordern.
Reduzieren Sie verwandte Abfragen.

Siehe die folgenden BBS-Effektstatistiken . Zählen Sie nicht die Anzahl der Beiträge, sondern fügen Sie sie unter der Spalte „Redundante Felder“ hinzu. Aktualisieren Sie die Anzahl der Artikel jedes Mal, wenn ein Artikel gepostet wird, wodurch die Abfrageintensität verringert wird.

Prinzip der Spaltenauswahl:

1: Feldtyp-Priorität Ganzzahl> Datum, Uhrzeit > Zeichensatzunterschied

Zum Beispiel tinyint 1,2 ,3,4,5 71fb34173e4ee87dab1f85dc1c283a44 char(1) a,b,c,d,e, in Bezug auf den Platz, den sie alle belegen 1 Byte, aber Reihenfolge
nach Sortierung, ersteres ist schneller

Grund: Letzteres muss den Zeichensatz und den Sortiersatz (also die Sortierregeln) berücksichtigen

Zeit ist Feste Länge, schnelle Bedienung und Platzersparnis, es ist unpraktisch, SQL zu schreiben, wo
> Der Zweck besteht darin, den Wert einzuschränken. Er wird intern im Integer-Typ gespeichert, aber in Kombination mit char ist die interne Zeichenfolgen- und Wertkonvertierung erforderlich
Char hat unter Berücksichtigung des Zeichensatzes und des (Sortierungs-)Sortierungssatzes eine feste Länge
varchar, und die variable Länge muss die Konvertierung des Zeichensatzes und des Sortiersatzes während der Sortierung berücksichtigen, was langsam ist.
text/Blob kann keine temporären Speichertabellen (Sortierung usw.) verwenden. Der Vorgang kann nur ausgeführt werden auf der Festplatte)

Geschlecht: Nehmen Sie utf8 als Beispiel

char(1), 3 Wörter lange Bytes

enum('male',' Female'); / Intern zur Speicherung in Zahlen umgewandelt, gibt es einen zusätzlichen Konvertierungsprozess

tinyint(), // 0 1 2 // Feste Länge von 1 Byte.

SQL-Optimierung Buch „MYSQL High Performance Optimierung“

Bezüglich der Auswahl von Datum/Uhrzeit ist die klare Meinung des Meisters, direkt int unsgined not null zu wählen, um den Zeitstempel zu speichern http://www.xaprb.com/blog/2014/01 /30/ timestamps-in-mysql/

Time--->Als Ganzzahl speichern

2: Gerade genug, seien Sie nicht großzügig (wie smallint, varchar(N))

Grund: Große Felder verschwenden Speicher und beeinträchtigen die Geschwindigkeit.

Nehmen Sie age als Beispiel: tinyint not null kann 255 Jahre speichern, was ausreicht.

Der in varchar(10) und varchar(300) gespeicherte Inhalt ist derselbe, aber während der Tabellenverknüpfungsabfrage benötigt varchar(300) mehr Speicher

3: Vermeiden Sie die Verwendung von NULL()

Grund: NULL ist für die Indizierung nicht geeignet und muss mit speziellen Bytes markiert werden

nimmt tatsächlich mehr Speicherplatz auf der Festplatte ein (MySQL5.7 hat Null verbessert, aber die Abfrage ist immer noch unbequem)

Experiment:

Sie können zwei Tabellen mit denselben Feldern erstellen, eine darf null sein und die andere darf nicht null sein, fügen Sie jeweils 10.000 Einträge hinzu und überprüfen Sie die Größe von Sie können feststellen, dass der Index für null größer ist (in mysql5.5 wurde der Null-Wert optimiert und der Größenunterschied ist nicht mehr offensichtlich)

Außerdem ist null nicht praktisch für Abfrage,

wobei Spaltenname=null;

wobei Spaltenname!=null; kein Wert gefunden werden kann,

wobei Spaltenname null ist oder nicht null ist Abfrage.




create table dictnn (
id int,
word varchar(14) not null default '',
key(word)
)engine myisam charset utf8;
create table dictyn (
id int,
word varchar(14),
key(word)
)engine myisam charset utf8;
alter table dictnn disable keys;
alter table dictyn disable keys;
insert into dictnn select id,if(id%2,word,'') from dict limit 10000;
insert into dictyn select id,if(id%2,word,null) from dict limit 10000;
alert table dictnn enable keys;
alter table dictyn enable keys;
Beschreibung der Enum-Spalte


1: Die Enum-Spalte wird intern als Ganzzahl gespeichert

2: Die Enum-Spalte lässt sich am schnellsten mit der Enum-Spalte verknüpfen

3: Die Enum-Spalte ist schwächer als (var) char---wenn es so ist In Verbindung mit char muss es konvertiert werden.

4: Der Vorteil besteht darin, dass char immer noch eine Ganzzahl mit fester Länge ist.

Wann Je größer die abgefragte Datenmenge ist, desto deutlicher wird der Vorteil von enum.

5: enum hängt mit char/varchar zusammen, da es konvertiert werden muss und die Geschwindigkeit langsamer ist als enum->enum. char->char,

aber manchmal wird es so verwendet ----- Das heißt, wenn die Datenmenge besonders groß ist, kann IO gespeichert werden

Test:




create table t2 (
id int,
gender enum('man','woman'),
key(gender)
)engine myisam charset utf8;
create table t3 (
id int,
gender char(5) not null default '',
key(gender)
)engine myisam charset utf8;
alter table t2 disable keys;
alter table t3 disable keys;
Spaltec63bf5d6257ea40a0ddea7fe0604ffc8Spalte
insert into t2 select id,if(id%2,'man','woman') from dict limit 10000;
insert into t3 select id,if(id%2,'man','woman') from dict limit 10000;
alter table t2 enable keys;
alter table t3 enable keys;
mysql> select count(*) from t2 as ta,t2 as tb where ta.gender=tb.gender
mysql> select count(*) from t3 as ta,t3 as tb where ta.gender=tb.gender
Zeit




Enumb6fe9feb9d4c7afa9e35009a988b8cc2enum

10,53




Char4bc407409327eef13c66a538ac7449a4char

24,65




Enum4bc407409327eef13c66a538ac7449a4char

18.22




Wenn die Vorteile der t2-Tabelle nicht offensichtlich sind, erhöhen Sie die Geschlechtsspalte von t3, char(15),
char(20)...

Mit zunehmender Größe werden die Vorteile der t2-Tabelle nach und nach deutlich



Der Grund dafür ist, dass die von enum('manmaman','womanwomanwoman') aufgezählten Zeichen unabhängig davon, wie lang sie sind,

Intern durch Ganzzahlen und die Größe dargestellt werden der im Speicher generierten Daten bleiben unverändert

Der Typ char generiert jedoch immer mehr Daten im Speicher



Zusammenfassung: Enum- und Enum-Typen sind verknüpft schneller

Enum-Typ spart IO

Das Obige ist MySQL-Optimierung (1) Tabellenoptimierung und Spaltentypauswahl, weitere verwandte Bitte beachten Sie die chinesische PHP-Website (www.php.cn). Inhalt!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn