в одном здании может быть
phone ------ phonum building naim -------- street bd_id >------------ bd_id ------ other st_id >----------- st_id bldng nick
Значок >-- обозначает сторону "много" в отношении "один ко многим" и означает, что в одном здании может быть много телефонных номеров, а на одной улице много зданий.
Начать придется с конца, с таблицы street, которая будет содержать список улиц, и на которую будет ссылаться таблица building, содержащая, в свою очередь, список всех телефонизированных зданий в городе.
create table street ( st_id smallint unsigned not null auto_increment, nick varchar(32) not null, primary key (st_id) ); insert into street ( nick ) select distinct street from old;
Заполнение таблицы заняло 12.1 сек. Теперь создадим таблицу building
create table building ( bd_id smallint unsigned not null auto_increment, st_id smallint unsigned not null references street, bldng varchar(8) not null, tmp varchar(40) not null, # временно, для соответствия с old primary key (bd_id) );
и также заполним ее
insert into building ( st_id, tmp, bldng ) select distinct street.st_id, street.nick, old.bldng from old, street where old.street=street.nick;
Таблица заполнялась аж 5 мин. 23 сек., так что было время задуматься. Прояснить ситуацию в таких случаях помогает особая команда explain, например
explain select distinct street.st_id, street.nick, old.bldng from old, street where old.street=street.nick;
которая выдала следующую подсказку:
+--------+------+---------------+------+---------+------+--------+------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | +--------+------+---------------+------+---------+------+--------+------------+ | street | ALL | NULL | NULL | NULL | NULL | 591 | | | old | ALL | NULL | NULL | NULL | NULL | 122794 | where used | +--------+------+---------------+------+---------+------+--------+------------+
Оказывается, для каждой записи из old происходит поиск в таблице street, т.е. просматриваются O(122794*591) строк.
Содержание Назад Вперед