webentwicklung-frage-antwort-db.com.de

Versteckte Funktionen von MySQL

Ich arbeite seit vielen Jahren mit Microsoft SQL Server , habe aber erst kürzlich damit begonnen, MySQL für meine Webanwendungen zu verwenden, und bin hungrig nach Wissen.

Um mit der langen Reihe von "Hidden Feature" -Fragen fortzufahren, möchte ich alle versteckten oder nützlichen Funktionen von MySQL kennen, die hoffentlich meine Kenntnisse dieser Open Source-Datenbank verbessern.

101
GateKiller

Da Sie ein Kopfgeld setzen, teile ich meine hart erkämpften Geheimnisse ...

Im Allgemeinen sind für alle SQL-Anweisungen, die ich heute optimiert habe, Unterabfragen erforderlich. Da ich aus der Oracle-Datenbankwelt stamme, funktionierten Dinge, die ich für selbstverständlich hielt, nicht mit MySQL. Und meine Lektüre zu MySQL-Tuning lässt mich den Schluss ziehen, dass MySQL bei der Optimierung von Abfragen hinter Oracle zurückliegt.

Während die einfachen Abfragen, die für die meisten B2C-Anwendungen erforderlich sind, für MySQL gut funktionieren, erfordern die meisten für Intelligence Reporting erforderlichen Abfragen für die Berichterstellung einiges an Planung und Reorganisation der SQL-Abfragen, damit MySQL sie schneller ausführen kann.

Verwaltung:

max_connections ist die Anzahl der gleichzeitigen Verbindungen. Der Standardwert ist 100 Verbindungen (151 seit 5.0) - sehr klein.

Hinweis:

verbindungen nehmen Speicher in Anspruch und Ihr Betriebssystem kann möglicherweise nicht viele Verbindungen verarbeiten.

Mit MySQL-Binärdateien für Linux/x86 können Sie bis zu 4096 gleichzeitige Verbindungen herstellen, selbst kompilierte Binärdateien sind jedoch häufig weniger eingeschränkt.

Stellen Sie table_cache so ein, dass es mit der Anzahl Ihrer offenen Tabellen und gleichzeitigen Verbindungen übereinstimmt. Beobachten Sie den Wert open_tables, und wenn er schnell wächst, müssen Sie ihn vergrößern.

Hinweis:

Die beiden vorherigen Parameter erfordern möglicherweise viele offene Dateien. 20 + max_connections + table_cache * 2 ist eine gute Schätzung für das, was Sie brauchen. MySQL unter Linux verfügt über eine open_file_limit-Option. Legen Sie dieses Limit fest.

Bei komplexen Abfragen sind sort_buffer_size und tmp_table_size wahrscheinlich sehr wichtig. Die Werte hängen von der Komplexität der Abfrage und den verfügbaren Ressourcen ab. Es werden jedoch 4 MB bzw. 32 MB als Ausgangspunkt empfohlen.

Hinweis: Dies sind Werte "pro Verbindung", darunter "read_buffer_size", "read_rnd_buffer_size" und einige andere, was bedeutet, dass dieser Wert möglicherweise für jede Verbindung benötigt wird. Berücksichtigen Sie daher beim Festlegen dieser Parameter Ihre Last und die verfügbare Ressource. Beispielsweise wird sort_buffer_size nur zugewiesen, wenn MySQL eine Sortierung durchführen muss. Hinweis: Achten Sie darauf, dass Ihnen nicht der Speicher ausgeht.

Wenn Sie viele Verbindungen hergestellt haben (d. H. Eine Website ohne dauerhafte Verbindungen), können Sie die Leistung verbessern, indem Sie thread_cache_size auf einen Wert ungleich Null setzen. 16 ist ein guter Wert für den Anfang. Erhöhen Sie den Wert, bis Ihre threads_created nicht mehr sehr schnell wachsen.

PRIMÄRSCHLÜSSEL:

Es kann nur eine AUTO_INCREMENT-Spalte pro Tabelle geben. Sie muss indiziert sein und darf keinen DEFAULT-Wert haben

KEY ist normalerweise ein Synonym für INDEX. Das Schlüsselattribut PRIMARY KEY kann auch als nur KEY angegeben werden, wenn es in einer Spaltendefinition angegeben wird. Dies wurde aus Kompatibilitätsgründen mit anderen Datenbanksystemen implementiert.

Ein PRIMARY KEY ist ein eindeutiger Index, in dem alle Schlüsselspalten als NOT NULL definiert sein müssen

Wenn ein PRIMARY KEY- oder UNIQUE-Index nur aus einer Spalte mit einem Integer-Typ besteht, können Sie die Spalte in SELECT-Anweisungen auch als "_rowid" bezeichnen.

In MySQL lautet der Name eines PRIMARY KEY PRIMARY

Derzeit unterstützen nur InnoDB (v5.1?) - Tabellen Fremdschlüssel.

Normalerweise erstellen Sie alle Indizes, die Sie beim Erstellen von Tabellen benötigen. Jede als PRIMARY KEY, KEY, UNIQUE oder INDEX deklarierte Spalte wird indiziert.

NULL bedeutet "keinen Wert haben". Um auf NULL zu testen, können Sie nicht ​​die arithmetischen Vergleichsoperatoren wie =, <oder <> verwenden. Verwenden Sie stattdessen die Operatoren IS NULL und IS NOT NULL:

NO_AUTO_VALUE_ON_ZERO unterdrückt die automatische Inkrementierung für 0, sodass nur NULL die nächste Folgenummer generiert. Dieser Modus kann nützlich sein, wenn 0 in der AUTO_INCREMENT-Spalte einer Tabelle gespeichert wurde. (Das Speichern von 0 wird übrigens nicht empfohlen.)

So ändern Sie den Wert des AUTO_INCREMENT-Zählers, der für neue Zeilen verwendet werden soll:

ALTER TABLE mytable AUTO_INCREMENT = value; 

oder SET INSERT_ID = value;

Sofern nicht anders angegeben, beginnt der Wert mit: 1000000 oder gibt ihn folgendermaßen an:

...) ENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 1

ZEITSTEMPEL:

Werte für TIMESTAMP-Spalten werden zum Speichern von der aktuellen Zeitzone in UTC und zum Abrufen von UTC in die aktuelle Zeitzone konvertiert.

http://dev.mysql.com/doc/refman/5.1/de/timestamp.html Für eine TIMESTAMP-Spalte in einer Tabelle können Sie den aktuellen Zeitstempel als Standardwert und den automatischen Zeitstempel zuweisen. Wert aktualisieren.

wenn Sie einen dieser Typen in einer WHERE-Klausel verwenden, ist es am besten, WHERE datecolumn = FROM_UNIXTIME (1057941242) und nicht WHERE UNIX_TIMESTAMP (datecolumn) = 1057941242 zu verwenden auf dieser Spalte.

http://dev.mysql.com/doc/refman/5.1/de/date-and-time-functions.html

 UNIX_TIMESTAMP() 
 FROM_UNIXTIME() 
 UTC_DATE()
 UTC_TIME()
 UTC_TIMESTAMP()

wenn Sie eine Datums-/Uhrzeitangabe in einen Unix-Zeitstempel in MySQL konvertieren:
Und fügen Sie dann 24 Stunden hinzu:
Und konvertieren Sie es dann zurück in eine Datumszeit, bei der es auf magische Weise eine Stunde verliert!

Hier ist was passiert. Bei der Konvertierung des Unix-Zeitstempels in eine Datumszeit wird die Zeitzone berücksichtigt, und es kommt vor, dass wir zwischen dem 28. und 29. Oktober 2006 die Sommerzeit eingestellt haben und eine Stunde verloren haben.

Ab MySQL 4.1.3 geben die Funktionen CURRENT_TIMESTAMP (), CURRENT_TIME (), CURRENT_DATE () und FROM_UNIXTIME () Werte in der aktuelle Zeitzone der Verbindung zurück, die als Wert der Zeitzone verfügbar ist Systemvariable. Außerdem geht UNIX_TIMESTAMP () davon aus, dass sein Argument ein Datums-/Uhrzeitwert in der aktuellen Zeitzone ist.

Die aktuelle Zeitzoneneinstellung wirkt sich nicht auf Werte aus, die von Funktionen wie UTC_TIMESTAMP () oder Werten in DATE-, TIME- oder DATETIME-Spalten angezeigt werden.

HINWEIS: ON UPDATE ONLY aktualisiert die DateTime, wenn ein Feld geändert wird Wenn ein UPDATE dazu führt, dass keine Felder geändert werden, wird die DateTime NICHT aktualisiert!

Außerdem ist der erste TIMESTAMP standardmäßig immer AUTOUPDATE, auch wenn nichts angegeben ist

Wenn ich mit Dates arbeite, wandle ich mich fast immer an Julian Date, weil Datenmathematik dann aus dem gleichen Grund eine einfache Sache ist, Ganzzahlen und Sekunden seit Mitternacht zu addieren oder zu subtrahieren. Es ist selten, dass ich eine Zeitauflösung mit einer feineren Granularität als Sekunden benötige.

Beide können als 4-Byte-Ganzzahl gespeichert werden. Wenn der Speicherplatz sehr knapp ist, kann die UNIX-Zeit (Sekunden seit dem 1.1.1970) als vorzeichenlose Ganzzahl angegeben werden, die bis etwa 2106 gültig ist.

Sekunden in 24 Stunden = 86400

'Signed Integer max val = 2,147,483,647 - kann 68 Jahre von Sekunden halten

'Unsigned Integer max val = 4,294,967,295 - kann 136 Jahre von Sekunden halten

Binäres Protokoll:

In MySQL 4.1 wurde ein Binärprotokoll eingeführt, mit dem Datenwerte, die keine Zeichenfolgen sind, im nativen Format gesendet und zurückgegeben werden können, ohne dass eine Konvertierung in das und aus dem Zeichenfolgenformat erforderlich ist. (Sehr hilfreich)

Außerdem ist mysql_real_query () schneller als mysql_query (), da strlen () nicht aufgerufen wird, um die Anweisungszeichenfolge zu bearbeiten.

http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html Das Binärprotokoll unterstützt serverseitig vorbereitete Anweisungen und ermöglicht die Übertragung von Datenwerten im nativen Format. Das Binärprotokoll wurde in früheren Versionen von MySQL 4.1 ziemlich überarbeitet.

Mit dem Makro IS_NUM () können Sie testen, ob ein Feld einen numerischen Typ hat. Übergeben Sie den Typwert an IS_NUM (), und es wird TRUE ausgewertet, wenn das Feld numerisch ist:

Eine zu beachtende Sache ist, dass Binärdaten [~ # ~] innerhalb einer regulären Abfrage gesendet werden können, wenn Sie diese maskieren und sich daran erinnern, dass MySQL nur diesen Backslash benötigt und dem Anführungszeichen wird entgangen. Auf diese Weise können kürzere binäre Zeichenfolgen wie beispielsweise verschlüsselte/gesalzene Kennwörter auf einfache Weise eingefügt werden.

Master Server:

http://www.experts-exchange.com/Database/MySQL/Q_22967482.html

http://www.databasejournal.com/features/mysql/article.php/10897_3355201_2

GRANT REPLICATION SLAVE ON . to slave_user IDENTIFIED BY 'slave_password'

#Master Binary Logging Config  STATEMENT causes replication 
              to be statement-based -  default

log-bin=Mike
binlog-format=STATEMENT
server-id=1            
max_binlog_size = 10M
expire_logs_days = 120    


#Slave Config
master-Host=master-hostname
master-user=slave-user
master-password=slave-password
server-id=2

Die binäre Protokolldatei muss lauten:

http://dev.mysql.com/doc/refman/5.0/en/binary-log.html

http://www.mydigitallife.info/2007/10/06/how-to-read-mysql-binary-log-files-binlog-with-mysqlbinlog/

http://dev.mysql.com/doc/refman/5.1/de/mysqlbinlog.html

http://dev.mysql.com/doc/refman/5.0/en/binary-log.html

http://dev.mysql.com/doc/refman/5.1/de/binary-log-setting.html

Sie können alle binären Protokolldateien mit der RESET MASTER-Anweisung oder eine Teilmenge davon mit PURGE MASTER löschen

--result-file = binlog.txt TrustedFriend-bin.000030

Normalisierung:

http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html

UDF-Funktionen

http://www.koders.com/cpp/fid10666379322B54AD41AEB0E4100D87C8CDDF1D8C.aspx

http://souptonuts.sourceforge.net/readme_mysql.htm

Datentypen:

http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html

http://www.informit.com/articles/article.aspx?p=1238838&seqNum=2

http://bitfilm.net/2008/03/24/saving-bytes-efficient-data-storage-mysql-part-1/

Zu beachten ist, dass mySQL bei einer gemischten Tabelle mit CHAR und VARCHAR die CHAR-Werte in VARCHAR-Werte ändert

RecNum integer_type UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY (RecNum)

MySQL repräsentiert immer Datumsangaben mit dem ersten Jahr gemäß den Standardspezifikationen von SQL und ISO 8601

Sonstiges:

Das Abschalten einiger MySQl-Funktionen führt zu kleineren Datendateien und einem schnelleren Zugriff. Beispielsweise:

--datadir gibt das Datenverzeichnis und an

--skip-innodb deaktiviert die Option inno und spart Ihnen 10-20 Millionen

Mehr hier http://dev.mysql.com/tech-resources/articles/mysql-c-api.html

Download Kapitel 7 - Kostenlos

InnoDB ist transaktionell, aber es entsteht ein Performance-Overhead. Ich habe festgestellt, dass MyISAM-Tabellen für 90% meiner Projekte ausreichen. Nicht transaktionssichere Tabellen (MyISAM) bieten verschiedene Vorteile, die alle auftreten, weil:

es gibt keinen Transaktionsaufwand:

Viel schneller

Geringerer Speicherplatzbedarf

Zum Durchführen von Aktualisierungen wird weniger Speicher benötigt

Jede MyISAM-Tabelle wird in drei Dateien auf der Festplatte gespeichert. Die Dateien haben Namen, die mit dem Tabellennamen beginnen, und eine Erweiterung, die den Dateityp angibt. Eine .frm-Datei speichert das Tabellenformat. Die Datendatei hat die Erweiterung .MYD (MYData). Die Indexdatei hat die Erweiterung .MYI (MYIndex).

Diese Dateien können an einen intakten Speicherort kopiert werden, ohne die zeitaufwändige MySQL Administrators Backup-Funktion zu verwenden (ebenso die Wiederherstellung)

Der Trick besteht darin, eine Kopie dieser Dateien zu erstellen und dann die Tabelle zu löschen. Wenn Sie die Dateien zurücksetzen, erkennt MySQl sie und aktualisiert die Tabellenverfolgung.

Wenn Sie sichern/wiederherstellen müssen,

Das Wiederherstellen einer Sicherung oder das Importieren aus einer vorhandenen Sicherungsdatei kann abhängig von der Anzahl der Indizes und Primärschlüssel, die für jede Tabelle vorhanden sind, einige Zeit in Anspruch nehmen. Sie können diesen Vorgang drastisch beschleunigen, indem Sie Ihre ursprüngliche Speicherauszugsdatei folgendermaßen ändern:

SET AUTOCOMMIT = 0;
SET FOREIGN_KEY_CHECKS=0;

.. your dump file ..

SET FOREIGN_KEY_CHECKS = 1;
COMMIT;
SET AUTOCOMMIT = 1;

Fügen Sie den SQL-Befehl SET AUTOCOMMIT = 0 hinzu, um die Geschwindigkeit des Neuladens erheblich zu erhöhen. am Anfang der Dump-Datei, und fügen Sie die COMMIT; Befehl bis zum Ende.

Standardmäßig ist Autocommit aktiviert. Dies bedeutet, dass jeder Einfügebefehl in der Dump-Datei als separate Transaktion behandelt und auf die Festplatte geschrieben wird, bevor die nächste gestartet wird. Wenn Sie diese Befehle nicht hinzufügen, kann das Neuladen einer großen Datenbank in InnoDB viele Stunden dauern ...

Die maximale Größe einer Zeile in einer MySQL-Tabelle beträgt 65.535 Byte

Die effektive maximale Länge eines VARCHAR in MySQL 5.0.3 und on = maximale Zeilengröße (65.535 Bytes)

VARCHAR-Werte werden beim Speichern nicht aufgefüllt. Nachgestellte Leerzeichen werden beibehalten, wenn Werte gemäß Standard-SQL gespeichert und abgerufen werden.

CHAR- und VARCHAR-Werte in MySQL werden ohne Berücksichtigung von Leerzeichen verglichen.

Die Verwendung von CHAR beschleunigt den Zugriff nur, wenn der gesamte Datensatz eine feste Größe hat. Wenn Sie also ein Objekt mit variabler Größe verwenden, können Sie auch alle Objekte mit variabler Größe erstellen. Sie gewinnen keine Geschwindigkeit, wenn Sie eine CHAR in einer Tabelle verwenden, die auch eine VARCHAR enthält.

Das VARCHAR-Limit von 255 Zeichen wurde ab MySQL 5.0.3 auf 65535 Zeichen erhöht

Volltextsuchen werden nur für MyISAM-Tabellen unterstützt.

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

BLOB-Spalten haben keinen Zeichensatz und die Sortierung und der Vergleich basieren auf den numerischen Werten der Bytes in den Spaltenwerten

Wenn der strikte SQL-Modus nicht aktiviert ist und Sie einer BLOB- oder TEXT-Spalte einen Wert zuweisen, der die maximale Länge der Spalte überschreitet, wird der Wert passend abgeschnitten und eine Warnung generiert.

Nützliche Befehle:

überprüfe den strikten Modus: SELECT @@ global.sql_mode;

den strikten Modus ausschalten:

SET @@ global.sql_mode = '';

SET @@ global.sql_mode = 'MYSQL40'

oder entfernen: sql-mode = "STRICT_TRANS_TABLES, ...

SPALTEN VON mytable ANZEIGEN

SELECT max (namecount) AS virtualcolumn FROM mytable ORDER BY virtualcolumn

http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-fields.html

http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_last-insert-id last_insert_id ()

ruft die PK der letzten im aktuellen Thread eingefügten Zeile ab. max (pkcolname) Ruft die letzte PK insgesamt ab.

Anmerkung: Wenn die Tabelle leer ist, gibt max (pkcolname) 1 zurück. Mysql_insert_id () konvertiert den Rückgabetyp der systemeigenen MySQL C-API-Funktion mysql_insert_id () in einen Typ von long (in PHP als int bezeichnet).

Wenn Ihre AUTO_INCREMENT-Spalte den Spaltentyp BIGINT hat, ist der von mysql_insert_id () zurückgegebene Wert falsch. Verwenden Sie stattdessen die interne MySQL-SQL-Funktion LAST_INSERT_ID () in einer SQL-Abfrage.

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

Nur eine Anmerkung, wenn Sie versuchen, Daten in eine Tabelle einzufügen und die folgende Fehlermeldung angezeigt wird:

Unknown column ‘the first bit of data what you want to put into the table‘ in ‘field list’

mit so etwas wie

INSERT INTO table (this, that) VALUES ($this, $that)

dies liegt daran, dass Sie keine Apostrophe für die Werte haben, die Sie in die Tabelle aufnehmen möchten. Also sollten Sie Ihren Code ändern in:

INSERT INTO table (this, that) VALUES ('$this', '$that') 

erinnerung daran, dass `` verwendet werden, um MySQL-Felder, -Datenbanken oder -Tabellen zu definieren, nicht Werte;)

Keine Verbindung zum Server während der Abfrage:

http://dev.mysql.com/doc/refman/5.1/en/gone-away.html

http://dev.mysql.com/doc/refman/5.1/de/packet-too-large.html

http://dev.mysql.com/doc/refman/5.0/de/server-parameters.html

http://dev.mysql.com/doc/refman/5.1/de/show-variables.html

http://dev.mysql.com/doc/refman/5.1/en/option-files.html

http://dev.mysql.com/doc/refman/5.1/en/error-log.html

Suchanfragen optimieren

http://www.artfulsoftware.com/infotree/queries.php?&bw=131

Nun, das sollte ausreichen, um den Bonus zu verdienen, denke ich ... Die Früchte vieler Stunden und vieler Projekte mit einer großartigen kostenlosen Datenbank. Ich entwickle Anwendungsdatenserver auf Windows-Plattformen hauptsächlich mit MySQL. Das schlimmste Chaos, das ich beseitigen musste, war

Der ultimative Alptraum für MySQL-Legacy-Datenbanken

Dies erforderte eine Reihe von Anwendungen, um die Tabellen mit vielen der hier genannten Tricks zu etwas Nützlichem zu verarbeiten.

Wenn Sie dies erstaunlich hilfreich fanden, drücken Sie Ihren Dank aus, indem Sie ihn abstimmen.

Schauen Sie sich auch meine anderen Artikel und Whitepapers an: www.coastrd.com

161
Mike Trader

Eine der nicht so versteckten Eigenschaften von MySQL ist, dass es nicht wirklich gut darin ist, SQL-konform zu sein. Nun, eigentlich keine Bugs, aber mehr gotchas ... :-)

22
mat

Ein Befehl, um herauszufinden, welche Tabellen sich derzeit im Cache befinden:

mysql> SHOW open TABLES FROM test;
+----------+-------+--------+-------------+
| DATABASE | TABLE | In_use | Name_locked |
+----------+-------+--------+-------------+
| test     | a     |      3 |           0 |
+----------+-------+--------+-------------+
1 row IN SET (0.00 sec)

(Aus MySQL-Leistungsblog )

21
Eran Galperin

Ein Befehl, um herauszufinden, wer was tut:

mysql> show processlist;
show processlist;
+----+-------------+-----------------+------+---------+------+----------------------------------+------------------+
| Id | User        | Host            | db   | Command | Time | State                            | Info             |
+----+-------------+-----------------+------+---------+------+----------------------------------+------------------+
|  1 | root        | localhost:32893 | NULL | Sleep   |    0 |                                  | NULL             |
|  5 | system user |                 | NULL | Connect |   98 | Waiting for master to send event | NULL             |
|  6 | system user |                 | NULL | Connect | 5018 | Reading event from the relay log | NULL             |
+-----+------+-----------+---------+---------+-------+-------+------------------+
3 rows in set (0.00 sec) 

Und Sie können einen Prozess abbrechen mit:

mysql>kill 5 
15
CMS

Mir gefällt besonders die in MySQL integrierte Unterstützung für inet_ntoa() und inet_aton(). Dies macht die Handhabung von IP-Adressen in Tabellen sehr einfach (zumindest solange es sich nur um IPv4-Adressen handelt!)

11
Alnitak

Ich liebe on duplicate key (AKA Upsert, Merge) für alle Arten von träge erstellten Zählern:

insert into occurances(Word,count) values('foo',1),('bar',1) 
  on duplicate key cnt=cnt+1

Sie können viele Zeilen in eine Abfrage einfügen und sofort doppelten Index für jede der Zeilen verarbeiten.

11
Kornel

Der "Pager" -Befehl im Client

Wenn Sie beispielsweise 10.000 Zeilen in Ihrem Ergebnis haben und diese anzeigen möchten (Dies setzt die verfügbaren Befehle "less" und "tee" voraus, was normalerweise unter Linux der Fall ist; in Windows YMMV).

pager less
select lots_of_stuff FROM tbl WHERE clause_which_matches_10k_rows;

Und Sie erhalten sie im "weniger" -Dateibetrachter, damit Sie sie gut durchblättern, suchen usw. können.

Ebenfalls

pager tee myfile.txt
select a_few_things FROM tbl WHERE i_want_to_save_output_to_a_file;

Wird bequem in eine Datei schreiben.

7
MarkR

Einige Dinge, die Sie vielleicht interessant finden:

<query>\G -- \G in the CLI instead of the ; will show one column per row
explain <query>; -- this will show the execution plan for the query
6
SorinV

Keine versteckte Funktion, aber dennoch nützlich: http://mtop.sourceforge.net/

4
Eddy

Ich denke nicht, dass dies MySQL-spezifisch ist, aber für mich ist es aufschlussreich:

Anstatt zu schreiben

WHERE (x.id > y.id) OR (x.id = y.id AND x.f2 > y.f2) 

Du kannst einfach schreiben

WHERE (x.id, x.f2) > (y.id, y.f2)
3
Johan

Hier sind einige meiner Tipps - ich habe darüber in meinem Blog gebloggt ( Link )

  1. Sie müssen das @ -Zeichen nicht verwenden, wenn Sie Variablen deklarieren.
  2. Sie müssen ein Trennzeichen verwenden (die Standardeinstellung ist ';'), um das Ende einer Anweisung abzugrenzen - Link
  3. Wenn Sie versuchen, Daten zwischen MS-SQL 2005 und mySQL zu verschieben, müssen Sie einige Rahmen durchspringen - Link
  4. Ausführen von Übereinstimmungen mit Groß- und Kleinschreibung in mySQL - link
3
Nikhil

Wenn Sie cmdline Mysq verwenden, können Sie mit der Befehlszeile interagieren (auf Linux-Computern - nicht sicher, ob es unter Windows einen entsprechenden Effekt gibt), indem Sie das Kreischen/Ausrufezeichen verwenden. Beispielsweise:

\! cat file1.sql

zeigt den Code für file1.sql an. Verwenden Sie die Tee-Funktion, um Ihre Anweisung und Abfrage in einer Datei zu speichern

\T filename

um dies auszuschalten, benutze\t

Verwenden Sie zuletzt "Quellendateiname", um ein Skript auszuführen, das Sie bereits gespeichert haben. Die normale Alternative besteht natürlich darin, den Skriptnamen einzugeben, wenn Sie mysql von der Kommandozeile aus starten:

    mysql -u root -p < case1.sql

Hoffe das nützt jemandem!

Bearbeiten: Ich habe mich an eine andere erinnert - beim Aufrufen von mysql über die Befehlszeile können Sie die Option -t verwenden, damit die Ausgabe im Tabellenformat erfolgt - ein echter Segen mit einigen Abfragen (obwohl das Beenden von Abfragen mit\G, wie an anderer Stelle hier erwähnt, natürlich auch der Fall ist hilfreich in dieser Hinsicht). Viel mehr über verschiedene Schalter Command Line Tool

Ich habe gerade eine gute Möglichkeit gefunden, die Reihenfolge einer Sortierung zu ändern (normalerweise Fall ...). 4) Sie können die Feldfunktion innerhalb der Order by-Klausel verwenden. Beispielsweise

Sortiere nach Feld (sort_field, 1,4,3,2)

3
DBMarcos99

Wenn Sie mit großen und/oder hochtransaktionsfähigen InnoDb-Datenbanken arbeiten, lernen und verstehen Sie "SHOW INNODB STATUS" Mysql Performance Blog , dann wird es Ihr Freund.

3
Hawk Kroeger

Der eingebaute SQL Profiler .

2
Eugene Yarmash

Eigentlich dokumentiert , aber sehr ärgerlich: automatische Umrechnungen bei falschen Daten und sonstigen Fehleingaben.

Vor MySQL 5.0.2 vergibt MySQL unzulässige oder unzulässige Datenwerte und zwingt diese zur Dateneingabe auf zulässige Werte. In MySQL 5.0.2 und höher bleibt dies das Standardverhalten, aber Sie können den Server-SQL-Modus ändern, um eine traditionellere Behandlung von fehlerhaften Werten auszuwählen, sodass der Server sie ablehnt und die Anweisung abbricht, in der sie auftreten.

Datumsangaben: Manchmal haben Sie "Glück", wenn MySQL die Eingabe nicht an in der Nähe gültige Datumsangaben anpasst, sondern als 0000-00-00 Speichert, was per Definition ungültig ist. Selbst dann hätten Sie vielleicht gewollt, dass MySQL fehlschlägt, anstatt diesen Wert stillschweigend für Sie zu speichern.

2
Arjan

mysqlsla - Eines der am häufigsten verwendeten Analysetools für langsame Abfrageprotokolle. Sie können die 10 häufigsten Abfragen seit dem letzten Rollout langsamer Abfrageprotokolle sehen. Sie können auch feststellen, wie oft eine BAD-Abfrage ausgelöst wurde und wie viel Zeit der Server insgesamt in Anspruch genommen hat.

2
pawan

Bei meinen Benchmarks mit großen Datasets und DATETIME-Feldern ist diese Abfrage immer langsamer:

SELECT * FROM mytable
WHERE date(date_colum) BETWEEN '2011-01-01' AND ''2011-03-03';

Als dieser Ansatz:

SELECT * FROM mytable
WHERE date_column BETWEEN '2011-01-01 00:00:00' AND '2011-03-03 23:59:59'
1
Osvaldo Mercado

InnoDB speichert standardmäßig alle Tabellen in einem globalen Tabellenbereich, der niemals verkleinert .

Sie können innodb_file_per_table, wodurch jede Tabelle in einem separaten Tabellenbereich abgelegt wird, der gelöscht wird, wenn Sie die Tabelle oder Datenbank löschen.

Planen Sie dies voraus, da Sie die Datenbank sichern und wiederherstellen müssen, um anderenfalls Speicherplatz freizugeben.

Verwenden von Tablespaces pro Tabelle

1
serbaut

Wenn Sie in die datetime-Spalte einen leeren String "" einfügen, behält MySQL den Wert 00/00/0000 00:00:00 bei. Im Gegensatz zu Oracle, bei dem kein Wert gespeichert wird.

1
Devid G