News:

Bored?  Looking to kill some time?  Want to chat with other SMF users?  Join us in IRC chat or Discord

Main Menu

Adding indexes for SMF performance?

Started by Glasso, January 17, 2013, 03:18:41 AM

Previous topic - Next topic

Glasso

Hi,

SQLTuner script on my VPS shows that many queries are being executed without indexes. There also seem to be some slow queries. I have tried playing with adding some indexes without much success. I am hoping the DB experts can suggest proper indexes for some of these most frequent queries. Thanks in advance.

Glasso


# Query_time: 26  Lock_time: 0  Rows_sent: 255  Rows_examined: 10226
SELECT m.id_msg
FROM f_messages AS m
INNER JOIN f_boards AS b ON (b.id_board = m.id_board)
INNER JOIN f_topics AS t ON (t.id_topic = m.id_topic)
WHERE (FIND_IN_SET(-1, b.member_groups) != 0)
AND b.id_board != 13
AND m.id_msg <= b.id_last_msg AND m.id_msg >= 7226
AND m.approved = 1
ORDER BY m.id_msg DESC
LIMIT 255;

butch2k

What is the result of an "explain extended <your query>".

Knowing SMF internals, i see no optimization possible for this query if you kept the standard indexes. Adding "approved" to a covering index won't be worth it since it's not discriminating enough (approved will be 1 in all cases except a few ones and than only if you activated the approval system).

Glasso

#3
Thanks for the response, butch2k. Here is the output:

id    select_type    table    type    possible_keys    key    key_len    ref    rows    Extra   
1 SIMPLE t index PRIMARY is_sticky 1
763 Using index; Using temporary; Using filesort
1 SIMPLE m ref PRIMARY,topic,id_board,approved,id_topic,current_topic current_topic 3 fdb.t.id_topic 9 Using where
1 SIMPLE b eq_ref PRIMARY PRIMARY 2 fdb.m.id_board 1 Using where

Glasso

#4
# Query_time: 0  Lock_time: 0  Rows_sent: 0  Rows_examined: 6
SELECT bi.id_ban, bi.email_address, bi.id_member, bg.cannot_access, bg.cannot_register,
bg.cannot_post, bg.cannot_login, bg.reason, IFNULL(bg.expire_time, 0) AS expire_time
FROM f_ban_items AS bi
INNER JOIN f_ban_groups AS bg ON (bg.id_ban_group = bi.id_ban_group AND (bg.expire_time IS NULL OR bg.expire_time > 1358426900))
WHERE
(((119 BETWEEN bi.ip_low1 AND bi.ip_high1)
AND (235 BETWEEN bi.ip_low2 AND bi.ip_high2)
AND (54 BETWEEN bi.ip_low3 AND bi.ip_high3)
AND (120 BETWEEN bi.ip_low4 AND bi.ip_high4)) OR ('119.235.54.120' LIKE bi.hostname) OR ((119 BETWEEN bi.ip_low1 AND bi.ip_high1)
AND (235 BETWEEN bi.ip_low2 AND bi.ip_high2)
AND (54 BETWEEN bi.ip_low3 AND bi.ip_high3)
AND (120 BETWEEN bi.ip_low4 AND bi.ip_high4)) OR ('119.235.54.120' LIKE bi.hostname));


Explain output:


id    select_type    table   type    possible_keys   key    key_len   ref   rows    Extra   
1 SIMPLE bg ALL PRIMARY 6 Using where
1 SIMPLE bi ALL id_ban_group 9 Using where

butch2k

This table is so small that it's faster to query directly the table w/o resorting to indexes. If you kept SMF indexes and did not install any mods you should be good with the default indexes.

Glasso

So no changes for query 1 or 2?
Query 1 seems to take a long time.

butch2k

It's definitely not index related. What kind of hosting is it, shared/VPS ?

Glasso

VPS Xen 512MB RAM
Pretty solid on load tests.

butch2k

Do you notice any real slowdown on your site ?


Glasso


Advertisement: