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

MySQL-Optimierung (1) Tabellenoptimierung und Auswahl des Spaltentyps

黄舟
Freigeben: 2016-12-29 16:04:13
Original
1308 Leute haben es durchsucht

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 <--> 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 &#39;&#39;,
key(word)
)engine myisam charset utf8;
Nach dem Login kopieren
create table dictyn (
id int,
word varchar(14),
key(word)
)engine myisam charset utf8;
Nach dem Login kopieren
alter table dictnn disable keys;
alter table dictyn disable keys;
Nach dem Login kopieren
insert into dictnn select id,if(id%2,word,&#39;&#39;) from dict limit 10000;
insert into dictyn select id,if(id%2,word,null) from dict limit 10000;
Nach dem Login kopieren
alert table dictnn enable keys;
alter table dictyn enable keys;
Nach dem Login kopieren
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(&#39;man&#39;,&#39;woman&#39;),
key(gender)
)engine myisam charset utf8;
Nach dem Login kopieren
create table t3 (
id int,
gender char(5) not null default &#39;&#39;,
key(gender)
)engine myisam charset utf8;
Nach dem Login kopieren
alter table t2 disable keys;
alter table t3 disable keys;
Nach dem Login kopieren
Spalte< ---->Spalte
insert into t2 select id,if(id%2,&#39;man&#39;,&#39;woman&#39;) from dict limit 10000;
insert into t3 select id,if(id%2,&#39;man&#39;,&#39;woman&#39;) from dict limit 10000;
Nach dem Login kopieren
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
Nach dem Login kopieren
Zeit




Enum<--->enum

10,53




Char<---->char

24,65




Enum<---->char

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!


Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage