Hi,
welche Indexe hast Du auf die Tabellen gelegt?
Anbei die Ausgabe vom Export:also keine Indexe, vom Primary Key abgesehen (den Du in der Selektion nicht nutzt). Damit haben wir den Übeltäter.
EXPLAIN SELECT liefert:
+----+-------------+-------+------+---------------+------+---------+------+-------+------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+-------+------------------------------+
| 1 | SIMPLE | s | ALL | NULL | NULL | NULL | NULL | 86121 | Using where; Using temporary |
| 1 | SIMPLE | r | ALL | NULL | NULL | NULL | NULL | 89520 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+-------+------------------------------+
>
> Die type=ALL sind kritisch und müssen unbedingt[1] eliminiert werden. Wenn Du günstige Indexe erzeugst, fallen sie weg.
OK, von Indexes außerhalb des Primärschlüssels hab ich bis jetzt noch nichts gehört gehabt, klingt aber spannend.
Kurz zum Abgleich:
Wenn ich Google richtig verstehe, werden die indizierten Spalten schon bei der Indexierung so aufbereitet, dass die Suchanfragen schneller abgearbeitet werden. Wenn ein neuer Datensatz hinzugefügt wird, wird der Index automatisch angepasst. Ich kann nahezu beliebig viele Spalten indizieren. Ich habe durch die Indizierung außer dem erhöhten Speicherbedarf keine Nachteile.
Ist das soweit korrekt?
Ich hab meine Datenbanken jetzt wie folgt angepasst:
~~~sql
CREATE TABLE IF NOT EXISTS `ref_sp` (
`id` bigint(20) unsigned NOT NULL auto_increment,
`oid` bigint(20) unsigned NOT NULL COMMENT 's_object_id',
`oid_r` bigint(20) unsigned default NULL,
`oid_rgw` bigint(20) unsigned default NULL,
`oid_l` bigint(20) unsigned default NULL,
`oid_p` bigint(20) unsigned default NULL,
`oid_i` bigint(20) unsigned default NULL,
`oid_sw` bigint(20) unsigned default NULL,
`oid_d` bigint(20) unsigned default NULL,
`oid_lia` bigint(20) unsigned default NULL,
`hostname` varchar(255) collate utf8_unicode_ci NOT NULL,
`vpn_id` bigint(20) unsigned NOT NULL,
`sp_no` bigint(20) unsigned NOT NUL,
`sp_id` varchar(255) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `oid` (`oid`),
KEY `oid_r` (`oid_r`),
KEY `oid_rgw` (`oid_rgw`),
KEY `oid_l` (`oid_l`),
KEY `oid_p` (`oid_p`),
KEY `oid_i` (`oid_i`),
KEY `oid_sw` (`oid_sw`),
KEY `oid_d` (`oid_d`),
KEY `oid_lia` (`oid_lia`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=86122 ;
CREATE TABLE IF NOT EXISTS `router_ce` (
`id` bigint(20) unsigned NOT NULL auto_increment,
`oid` bigint(20) unsigned NOT NULL COMMENT 'r_object_id',
....
`router_name` varchar(255) collate utf8_unicode_ci default NULL,
....
PRIMARY KEY (`id`),
KEY `oid` (`oid`),
KEY `router_name` (`router_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=89521 ;
EXPLAIN SELECT sagt jetzt:
+----+-------------+-------+------+---------------+-----------+---------+-------------------+-------+------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+-----------+---------+-------------------+-------+------------------------------+
| 1 | SIMPLE | s | ALL | oid_r | NULL | NULL | NULL | 86121 | Using where; Using temporary |
| 1 | SIMPLE | r | ref | oid | oid | 8 | rot.s.oid_r | 1 | |
+----+-------------+-------+------+---------------+-----------+---------+-------------------+-------+------------------------------+
Das ganze geht jetzt schon ein wenig ;) schneller (dauert nur noch ca. 10 Sekunden, zuvor waren es eben 25 Minuten)
In der ersten Spalte steht jetzt immernoch type ALL.
Sollte das jetzt noch weg und wenn ja, irgendwelche Ideen wie das geht?
Auch wenn ich alle Spalten indiziere steht da noch ALL.