Category Archives: MySQL

MySQL: Tabellengröße bestimmen

Welche Tabelle lohnt sich aufzuräumen, um die gesamte Datenbank kleiner und performanter zu bekommen?

Mit folgendem Skript bekommt man Zeilenanzahl (row count) und Speicherbedarf (size) aller Tabellen einer Datenbank namens „database_name“:

SELECT round((data_length + index_length)/(1024 *1024),2) sizeMB,
table_rows as row_count, table_name
FROM information_schema.TABLES
WHERE table_schema='database_name'
ORDER BY table_name;

Cheers
Ralf

MySQL: Tabelle mit Inhalt kopieren

Oft möchte man eine Arbeitskopie oder einfach eine Sicherung einer Tabelle in einer Datenbank machen. In MySQL kann man das mit einem Befehl machen:

CREATE TABLE new_table AS SELECT * FROM old_table;

Das DBMS erzeugt die Struktur der Tabelle aus der Quelltabelle und füllt danach auch gleich die neue mit Daten. Nice feature … ist mir bei MSSQL nicht bekannt, dass so etwas möglich wäre.

Cheers,
Ralf

MySQL: Suchen und Ersetzen in MySQL

Hier die Syntax zum Ersetzen von bestimmten Teilstrings:

update [table_name] set [field_name] = 
  replace([field_name],'[string_to_find]','[string_to_replace]');

In der MySQL-Doku haben sie es leider nicht so knackig auf den Punkt bekommen …

Ursprünglich:
http://www.mediacollege.com/computer/database/mysql/find-replace.html

Cheers,
Ralf

MySQL: Fehlende Einträge finden

Hin und wieder sucht man in zwei ähnlichen Tabellen nach fehlenden Einträgen. Das kommt beispielsweise vor, wenn wir zwei unterschiedliche Versionsstände einer Tabelle haben und diese vergleichen wollen. Nehmen wir an wir haben zwei Tabellen.

Tabelle „A“:

ID DESCRIPTION
1 Name1
2 Name2
4 Name4

Tabelle „B“:

ID DESCRIPTION
1 Name1
3 Name3
4 Name4

Bei einem Microsoft SQL Server würde man jetzt mit full outer join arbeiten:

SELECT A.ID as A1, B.ID as B1 
FROM A FULL OUTER JOIN B ON A.ID = B.ID
WHERE A.ID is null OR B.ID is null;

Als Ergebnis bekämen wir  hier zwei Zeilen und wüssten dann, dass in B die ID 2 fehlt und in A die ID 3.

A1 B1
2 null
null 3

Leider gibt es das bei MySQL nicht direkt, weil bei diesem Datenbankserver  „full outer join“ nicht unterstützt wird. Man muss also statt „full outer join“ den Ausdruck in zwei Teile mit zwei „joins“ aufteilen:

SELECT A.ID as A1, B.ID as B1 
FROM A LEFT OUTER JOIN B 
ON A.ID = B.ID
WHERE B.ID is null
UNION 
SELECT A.ID as A1, B.ID as B1
FROM A RIGHT OUTER JOIN B 
ON A.ID = B.ID
WHERE A.ID is null;

Hier ist eine nette Seite, die das Thema auch beschreibt:
http://www.peterkropff.de/site/mysql/full_outer_join.htm

Cheers,
Ralf

MySQL: Inner joins vs. sub queries

Heute wollte ich Kunden aus der Tabelle „Customers“ heraussuchen für die es in der Tabelle „Orders“ mindestens einen Auftrag gibt.

Mein erster Wurf dauerte 714 Sekunden:

SELECT * FROM customers WHERE ID in 
(SELECT customerID FROM orders group by customerID);

Der Verdacht liegt nahe, dass die Subquery hier nicht die richtige „Waffe“ ist:

select * from customers,
(SELECT customerID FROM orders group by customerID) as b 
where id = b.customerID;

Gleiches Ergebnis, aber schon nach 1,5 Sekunden. Eine gute Erklärung liefert folgender Thread:
http://stackoverflow.com/questions/141278/subqueries-vs-joins

Zusammenfassend kann man sagen, dass Subqueries zeilenweise immer wieder neu berechnet werden … leider auch, wenn keine Infos aus der Zeile benötigt werden.

Cheers,
Ralf