Obawiam się że dostanie mi się po uszach (hihi), ale mimo to zapytam.
Z góry proszę o wyrozumiałość, bo moja wiedza o MySQL nie jest duża.
Sprawa wygąda tak. Do greylistingu używam jednej tabeli w MySQL:
mysql> CREATE TABLE greylist (relay_ip char(15) NOT NULL, \
sender char(100) NOT NULL, recipient char(25) NOT NULL, \
block_expires datetime NOT NULL, \
PRIMARY KEY (relay_ip, sender, recipient));
Czyli wygląda to tak:
mysql> SELECT * FROM greylist;
+--------------+--------------+-----------+---------------------+
| relay_ip | sender | recipient | block_expires |
+--------------+--------------+-----------+---------------------+
| 193.17.41.76 | c...@o2.pl | aaa | 2008-06-02 11:05:24 |
| 193.17.41.50 | c...@o2.pl | bbb | 2008-06-02 03:37:29 |
| 193.17.41.16 | z...@o2.pl | zzz | 2008-06-02 12:02:23 |
+--------------+--------------+-----------+---------------------+
Zapytanie jak poniżej:
SELECT CASE \
WHEN now() - block_expires > 0 THEN 2 \
ELSE 1 \
END \
FROM greylist \
WHERE relay_ip = '${quote_mysql:$sender_host_address}' \
AND sender = '${quote_mysql:$sender_address}' \
AND recipient = '${quote_mysql:$local_part}'
Ponieważ ta tabela w przyszłości może się mocno rozrosnąć z tego co
zrozumiałem aby przyspieszyć działanie należy ją poindeksować.
Stworzyłem 4 indeksy (ponoć można max. 10):
mysql> CREATE INDEX block_expires ON greylist(block_expires);
mysql> CREATE INDEX relay_ip ON greylist(relay_ip);
mysql> CREATE INDEX sender ON greylist(sender);
mysql> CREATE INDEX recipient ON greylist(recipient);
Wycinam cześć kolumn żeby było to w miarę czytelne:
mysql> SHOW INDEX FROM greylist;
+----------+------------+---------------+--------------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name |
+----------+------------+---------------+--------------+---------------+
| greylist | 0 | PRIMARY | 1 | relay_ip | |
| greylist | 0 | PRIMARY | 2 | sender | |
| greylist | 0 | PRIMARY | 3 | recipient | |
| greylist | 1 | block_expires | 1 | block_expires | |
| greylist | 1 | relay_ip | 1 | relay_ip | |
| greylist | 1 | sender | 1 | sender | |
| greylist | 1 | recipient | 1 | recipient | |
+----------+------------+---------------+--------------+---------------+
Pyania:
1. Czy w związku z powyższym muszę jeszcze coś dodawać ?
2. Czy przy takim zapytaniu (jak wyżej) to indeksowanie będzie działać
automatycznie czy też w takim wypadku trzeba je zmienić ?
Tabela może być duża. Średnio ok. 40 tys. wpisów tygodniowo na początku,
później przyrost powinien się zmiejszyć.
Z góry dzięki za wszelkie sugestie.
pozdrawiam
Sławek
PRIMARY KEY zakłada od razu indeks, który jest idealny dla Twojego
zapytania. Nie potrzebujesz dodatkowych indeksów.
--
P.M.
Bardzo dziękuję za pomoc.
pozdrawiam
Sławek