Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[MySQL] Dodawanie indeksów - prośba o sprawdzenie

1 view
Skip to first unread message

Slawomir Stanczak

unread,
Jun 2, 2008, 6:55:22 AM6/2/08
to
Hello,

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

Paweł Matejski

unread,
Jun 2, 2008, 7:40:24 AM6/2/08
to
Slawomir Stanczak wrote:
> Hello,
>
> 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));

PRIMARY KEY zakłada od razu indeks, który jest idealny dla Twojego
zapytania. Nie potrzebujesz dodatkowych indeksów.

--
P.M.

Slawomir Stanczak

unread,
Jun 2, 2008, 8:41:04 AM6/2/08
to
Paweł Matejski wrote:
> PRIMARY KEY zakłada od razu indeks, który jest idealny dla Twojego
> zapytania. Nie potrzebujesz dodatkowych indeksów.
>

Bardzo dziękuję za pomoc.

pozdrawiam
Sławek

0 new messages