Пишу чат. Как правило в чате 100 человек.
Есть БД со следующей структурой:
Код: Выделить всё
CREATE TABLE MESSAGES (
MESSAGEID NUMERIC180 NOT NULL,
DATETIME INTEGER NOT NULL,
USERFK NUMERIC180 NOT NULL,
"MESSAGE" VARCHAR(5000) NOT NULL,
REPLYMID NUMERIC180,
STATUS SMALLINT NOT NULL
);
CREATE TABLE ONLINE (
USERFK NUMERIC180 NOT NULL,
LASTTIMEREFRESH INTEGER NOT NULL
);
CREATE TABLE USERS (
USERID NUMERIC180 NOT NULL,
);
ALTER TABLE MESSAGES ADD CHECK (STATUS IN (0,1,2));
ALTER TABLE MESSAGES ADD PRIMARY KEY (MESSAGEID);
ALTER TABLE ONLINE ADD PRIMARY KEY (USERFK);
ALTER TABLE USERS ADD PRIMARY KEY (USERID);
ALTER TABLE MESSAGES ADD FOREIGN KEY (USERFK) REFERENCES USERS (USERID) ON DELETE CASCADE;
ALTER TABLE MESSAGES ADD FOREIGN KEY (REPLYMID) REFERENCES MESSAGES (MESSAGEID) ON DELETE CASCADE;
ALTER TABLE ONLINE ADD FOREIGN KEY (USERFK) REFERENCES USERS (USERID) ON DELETE CASCADE;
CREATE INDEX IDX_MESSAGES1 ON MESSAGES (USERFK);
CREATE INDEX IDX_MESSAGES2 ON MESSAGES (REPLYMID);
CREATE UNIQUE INDEX IDX_MESSAGES3 ON MESSAGES (MESSAGEID);
CREATE INDEX IDX_ONLINE1 ON ONLINE (USERFK);
CREATE UNIQUE INDEX IDX_USERS1 ON USERS (USERID);
Какие параметры, операции вы посоветуете. Т.е. к примеру надо ли после inserta в таблицу Messages перещитывать статистику для индексов, может есть индексы которые лишние, и.т.д.
Можно ли соптимизировать следующий запрос:
Код: Выделить всё
SELECT U.FIO, U.ISVIP, M.* FROM USERS U, MESSAGES M
WHERE (U.USERID=M.USERFK AND MESSAGEID>$lastmsg)
ORDER BY M.DATETIME
Может быть можно держать часть данных в памяти?
Вообщем нужны советы.
P.S. Пожалуйста отнеситесь к данному вопросу серьезно.
С уважением Иван.