|
|
|
| Таблица USER:
id
name
password
mail
grup
|
Таблица NEWS:
id
userid
title
text
date
|
Таблица COMMENT:
id
userid
newsid
text
date
|
1) INSERT, UPDATE, DELETE затормаживает индексация, но т.к. данных будет много, я думаю, что выборка (SELECT) будет важнее, поэтому её я хочу ускорить в первую очередь, значит ли это что мне надо проиндексировать абсолютно ВСЕ поля таблиц?
2) Какое количество элементов стоит индексировать в полях и почему?
3) Как связать таблицы и задать отношения?
Буду очень благодарен, за ответы.
ЗЫ: кстати как вам организация базы данных(таблиц)? | |
|
|
|
|
|
|
|
для: F12
(05.06.2006 в 12:36)
| | 1) Нет.
2) Индексировать следует только те записи, которые будут фигурировать в WHERE-запросах, в данном случае все поля в чьём имени имеется id. Можно date - но лучше погодить с этим...
3) В MySQL, если вы только не используете таблицы InnoDB, внешних ключей нет - поэтому связи задаются программно, при помощи логики приложения. Если вы заботитесь о скорости, то лучше не использовать InnoBD таблицы, так как они значительно медленее MyISAM таблиц (иногда в разы).
PS Мне организация базы данных нравится - никаких вопиющих моментов нет. | |
|
|
|
|
|
|
|
для: cheops
(05.06.2006 в 19:12)
| | 2) Какое количество элементов стоит индексировать в полях и почему?
Не совсем то, что я бы хотел услышать. Имелось ввиду: при создании индекса есть параметр размер (или количество элементов) вот скоко их ставить и нужно ли их ставить вообще. Помойму я где то видел что это влияет на скорость.
Кстати если у поля есть primary key, значит индекс ему не нужен? (я про первый id во всех таблицах) | |
|
|
|
|
|
|
|
для: F12
(06.06.2006 в 15:12)
| | Размер указыватеся только для текстовых полей, так как понятно, что проиндексировав первые 10 символов, можно очень здорово ускорить поиск и для этого вовсе не обязательно индексировать все оставшиеся строки, так как строк у которых будут совпадать первые 10 символов будет мало.
Да, primary key сам по себе является индексом и дополнительно его индексировать не нужно. | |
|
|
|
|
|
|
|
для: cheops
(07.06.2006 в 00:49)
| | Спасиб за ответ. | |
|
|
|
|
|
|
|
для: F12
(07.06.2006 в 09:43)
| | Кстати вот что получилось, как вам? Может просто надо что-то исправить, добавить. (хочется сделать хорошую, оптимизированную БД)
--
-- Структура таблицы 'comment'
--
CREATE TABLE 'comment' (
'id' smallint(5) unsigned NOT NULL auto_increment,
'userid' smallint(5) unsigned NOT NULL default '0',
'newsid' smallint(5) unsigned NOT NULL default '0',
'text' char(180) NOT NULL default '',
'date' date NOT NULL default '0000-00-00',
PRIMARY KEY ('id'),
KEY 'userid' ('userid'),
KEY 'newsid' ('newsid')
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Структура таблицы 'news'
--
CREATE TABLE 'news' (
'id' smallint(5) unsigned NOT NULL auto_increment,
'userid' smallint(5) unsigned NOT NULL default '0',
'title' varchar(50) NOT NULL default '',
'text' text NOT NULL,
'date' date NOT NULL default '0000-00-00',
PRIMARY KEY ('id'),
KEY 'userid' ('userid')
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Структура таблицы 'user'
--
CREATE TABLE 'user' (
'id' smallint(5) unsigned NOT NULL auto_increment,
'name' char(8) NOT NULL default '',
'password' char(6) NOT NULL default '',
'mail' char(20) NOT NULL default '',
'grup' char(4) NOT NULL default '',
PRIMARY KEY ('id')
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;
|
| |
|
|
|
|
|
|
|
для: F12
(07.06.2006 в 10:43)
| | Странно, что date хранит DATE а не TIMESTAMP или DATETIME
И несовсем понятно, что такое grup | |
|
|
|
|
|
|
|
для: Trianon
(07.06.2006 в 11:00)
| | 1) TIMESTAMP или DATETIME, а почему странно? (некоторые вообще используют INT)
TIMESTAMP, DATETIME или DATE, какой из этих типов следует ставить и какой из них быстрее.
2) В поле grup будет вносится тип пользователя (admin, moder, user и тд...) | |
|
|
|
|
|
|
|
для: F12
(07.06.2006 в 11:07)
| | 1) Странно, потому что DATE компоненту времени не хранит. Такое впечатление, что Вам время дня не важно.
INT тоже имеет право на жизнь. Хотя бы потому, что код при этом получается значительно менее зависимым от типа сервера БД. Но и INT хранит время (обычно).
2) Тогда уж group.
Группа спроектирована безобразно.
здесь должен быть INT - внешний ключ к таблице с группами. | |
|
|
|
|
|
|
|
для: Trianon
(07.06.2006 в 11:12)
| | 1) А какой тип посоветуете использовать.
2) т.е сделать ещё одну таблицу:
Таблица GROUP:
Из таблицы USER удалить grup и добавить groupid.
Я правильно понял? | |
|
|
|
|
|
|
|
для: F12
(07.06.2006 в 11:19)
| | 1) TIMESTAMP или DATETIME . cheops посоветует второе :)
2а) да, если пользователь может входить лишь в одну группу.
2б)нет, если пользователь может входить в одну или несколько групп (или не входить ни в одну.) Тогда:
из таблицы USER убрать поле вообще.
создать таблицу usr_grp c полями id, id_user, id_group | |
|
|
|
|
|
|
|
для: Trianon
(07.06.2006 в 12:48)
| | Ок. Огромное спасибо. | |
|
|
|