Heute bin ich über etwas gestolpert, was mir einige Probleme bereitet… Im Zuge einer zukünftigen Anpassung einiger Software, hatte ich vor einiger Zeit verschiedene MySQL Tabellen so umgebaut, dass in der 4.0 Version die Timestamp Felder mit 19 Zeichen Länge hinterlegt sind (ohne “set new = 1″).

Das funktionierte auch Klasse… Anstelle von “20080901121504″ bekommt man dann ein schönes “2008-09-01 12:15:04″ im SELECT angezeigt und wird dies unter MySQL 5 eben auch so bekommen. Damit muss man nicht für beide “Fälle” programmieren.

Damit konnte ich recht elegant meine Software auf die 19 Zeichen vorbereiten und die Kompatibilität der Timestamp betreffenden Programmbereiche für eine später Umstellung auf MySQL 5 sicherstellen!

Heute fand ich nach langem testen ein Problem, welches dieses ganze schöne Vorgehen völlig absurdum fährt:

MySQL 4.0 benutzt eine “TIMESTAMP” deren Feldlänge mit 19 angegeben ist nie als INDEX in einem Query!

Ich konnte es kaum glauben.. aber es ist nach mehrmaligem Testen eindeutig so!

Einfache Demonstration:

CREATE TABLE `test` (
`id` int(11) NOT NULL auto_increment,
`ts1` timestamp(14) NOT NULL,
`ts2` timestamp(19) NOT NULL default ’0000-00-00 00:00:00′,
PRIMARY KEY  (`id`),
KEY `ts1` (`ts1`),
KEY `ts2` (`ts2`)
) TYPE=MyISAM;

INSERT INTO test (id,ts1,ts2) VALUES (NULL , ’20080101120000′, ’20080101120000′);

INSERT INTO test (id,ts1,ts2) VALUES (NULL , ’20080901120000′, ’20080901120000′);

Nun wird bei

EXPLAIN SELECT * FROM test WHERE ts1=’2008-01-01 12:00:00′

der Key “ts1″ benutzt…

bei…

EXPLAIN SELECT * FROM test WHERE ts2=’2008-01-01 12:00:00′

wird der Key “ts2″ nicht benutzt!

Wer Lust hat kann aus Key 1 mal einen timestamp(19) machen .. dann wird ts1 auch nicht mehr benutzt.

Das heißt… durch die Umstellung der TIMESTAMP’s auf timestamp(19) wurden diese in Queries welche eine TIMESTAMP im INDEX als Feld haben plötzlich gar nicht mehr verwendet. So etwas fällt auch unter Umständen nicht sofort auf, gerade wenn man solche mit mehreren Feldern verwendet.

Mag sein, dass dies einigen als “völlig Logisch” bekannt ist… für mich war es eine Erkenntnis die mich erstaunt hat. Ich hatte doch tatsächlich gedacht, dass das Darstellungsformat hier keine Auswirkung hat…

Tags:

One Response to “MySQL 4.0, Timestamp(19) und Indizes…”

  1. Update: Das gleiche Problem tritt auch auf, wenn ich mit “SET new = 1;” die TIMESTAMPs auf in dieser Connection auf das 19 stellige Format bringe. Auch dann werden Indizes die TIMESTAMP als Feld enthalten nicht mehr benutzt…

Leave a Reply

You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>