![]() |
Вопрос по MySQL
Нужна помощь по нескольким вопросам с которыми не удалось разобраться самостоятельно:
1) Для чего нужна индексация таблиц и в каких случаях ее применять? 2) Для чего нужен внешний ключ? Пример: CREATE TABLE logs (id int(3) AUTO_INCREMENT, r_id int(255) default NULL, ... PRIMARY KEY (id), KEY r_id (r_id) ) TYPE=MyISAM; Зарание спасибо... |
Re: Вопрос по MySQL
1. Индексация - нужна для ускорения поиска. Обычно индексируют по тем полям, к которым чаще всего обращаются.
Пример: Есть таблица Users(id: INT, FIO: VARCHAR, Phone: INT) Если подразумевается, что пользователей чаще будут выбирать по имени, то имеет смысл проиндексировать таблицу по полю FIO, если же чаще работают с телефоном, соотвественно, индексируют по Phone. 2. Внешний ключ. Ну, в класической теории реляционных БД внешний ключ используется для связи таблиц. В MySQL (начиная с 3.5, вроде), он кроме всего прочего юзается для поддержки ссылочной целостности. Пример: CREATE TABLE Users ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name NATIONAL VARCHAR(255) NOT NULL ); CREATE TABLE IF Messages ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, uid INT UNSIGNED NOT NULL, INDEX messages_ind(tid), FOREIGN KEY(uid) REFERENCES Users(id) ON DELETE CASCADE ON UPDATE CASCADE, ) TYPE=INNODB; Здесь мы создали две таблицы. Одна с инфой о юзерах Users, другая с сообщениями, сделанными юзарами Messages. Между ними есть связь один ко многим (т.е. одному юзеру соотвествуют несколько сообщений). При этом Messages.uid является внешним ключем для таблицы Messages. Однако, чтобы задействовать механизмы поодержки ссылочной целостности, приходится немного погемороится. В частности, мы создаем индекс по внешнему ключу (это требование MySQL) и затем указываем, как следует обрабатывать записи таблицы Messages при изменении соотвествующего им поля id таблицы Users. В данном случае я поставил каскадное удаление и обновление. Т.е. если юзер будет удален, то все связанные с ним сообщения удалятся автоматически, а если мы изменим id юзера, то соотвествующим образом изменятся uid всех сделанных этим юзером сообщений. |
Re: Вопрос по MySQL
Вобщем смыл понятен... спасибо за подробный ответ...
Добавлено через 31 минуту И вот еще один вопрос... есть 2-е таблицы: users, thems нужно выбрать в одном запросе: user, content из тбл. users posts_all, avatar из тбл. thems с одинаковым полем user Вот этот запрос рабочий: SELECT user, content, (SELECT posts_all FROM users a WHERE a.user=user) AS posts_all, (SELECT avatar FROM users a WHERE a.user=user) AS avatar FROM thems WHERE t='$t' AND pt='$pt'; но в нем есть минус: вложеный селект, который делает выборку из таблицы thems разделен на 2-а... Вобщем то это небольшой минус, но вобще интересно как можно объеденить этот SELECT или как то зделать выборку по другому... (и как здесь можно применить ключи) |
Re: Вопрос по MySQL
Если я правильно понял, то:
1. SELECT u.user p.content, t.avatar FROM users AS u, posts_all AS p, thems AS t WHERE (u.user = p.user AND u.user = t.user) 2. SELECT u.user, p.content, t.avatar FROM users AS u INNER JOIN posts_all AS p ON u.user = p.user INNER JOIN themes AS t ON u.user = t.user |
Re: Вопрос по MySQL
Все спасибо...
|
| Часовой пояс GMT +3, время: 03:58. |
Powered by vBulletin® Version 3.8.11 PL4;
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd;
Оператор обработки ПДн - ИП Алексеев А.С.;
ИНН: 333411310227; ОГРН: 307333419200050;
тел. +7 (4922) 49-42-22, legal@smalta.net