phpBB2Refugees.com Logo
Not affiliated with or endorsed by the phpBB Group

Register •  Login 

Continue the legacy...

Welcome to all phpBB2 Refugees!Wave Smilie

This site is intended to continue support for the legacy 2.x line of the phpBB2 bulletin board package. If you are a fan of phpBB2, please, by all means register, post, and help us out by offering your suggestions. We are primarily a community and support network. Our secondary goal is to provide a phpBB2 MOD Author and Styles area.

The Slowest Query

Goto page 1, 2  Next
 
Search this topic... | Search General Support... | Search Box
Register or Login to Post    Index » General Support  Previous TopicPrint TopicNext Topic
Author Message
b0blee
Board Member



Joined: 11 Jun 2012

Posts: 25
Location: Cloverdale, northern California



PostPosted: Sun Dec 20, 2020 7:15 pm 
Post subject: The Slowest Query

Apparently I posted this in the wrong forum. Apologies to the Admin. icon_redface.gif
I have removed the other copy Jim

My board is very large and quite active, and sometimes it gets slow. Recently I activated mysql's Slow Query Log and found that one query in particular was a real hog.

Code:
$ mysqldumpslow slow_query.log

Reading mysql slow query log from slow_query.log
Count: 8  Time=16.21s (129s)  Lock=0.00s (0s)  Rows=1.0 (8), quasar[quasar]@localhost
  SELECT MAX(post_time) AS last_post
  FROM sgf_posts
  WHERE forum_id = N

The code in question can be found in viewforum.php:

Code:
// Handle marking posts
//
if ( $mark_read == 'topics' )
{
   if ( $userdata['session_logged_in'] )
   {
      $sql = "SELECT MAX(post_time) AS last_post
         FROM " . POSTS_TABLE . "
         WHERE forum_id = $forum_id";

The phpBB version is 2.0.22. I'm thinking that maybe a fix appeared in a later version. The query examines every post in a forum, as this log entry shows:

Code:
# Query_time: 14.652648  Lock_time: 0.000074 Rows_sent: 1  Rows_examined: 460532
SET timestamp=1608476028;
SELECT MAX(post_time) AS last_post
         FROM sgf_posts
         WHERE forum_id = 15;

460532 rows examined! There must be a better way. Any ideas?

_________________
-𝕓𝕆𝕓- at The Steel Guitar Forum
Back to top
drathbun
Board Member



Joined: 24 Jul 2008

Posts: 716
Location: Texas


flag
PostPosted: Mon Dec 21, 2020 4:26 pm 
Post subject: Re: The Slowest Query

I took at look at this query. The index that is used (by default) is an index on forum_id. That means if you have a forum with a lot of posts, it's not very efficient. I use putty to log in to my server (rather than using a web-based GUI) so what I am about to show is based on that interface. Use whatever tools you have available. Note that by the end of this post I came to a different solution but rather than deleting all of this text I decided to leave it to show the process I used to get to my destination...

First, it's not always a good idea to create an index for one specific issue. The more indexes you have on your table, the slower standard operations (like inserts or updates) take, because there are more steps. That being said, if this particular event is causing a strain on your database you can consider the following.

First, here's a list of standard indexes on the phpbb_posts table for 2.0.22. They're at the end of the create table statement.
Code:
CREATE TABLE phpbb_posts (
   post_id mediumint(8) UNSIGNED NOT NULL auto_increment,
   topic_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
   forum_id smallint(5) UNSIGNED DEFAULT '0' NOT NULL,
   poster_id mediumint(8) DEFAULT '0' NOT NULL,
   post_time int(11) DEFAULT '0' NOT NULL,
   poster_ip char(8) NOT NULL,
   post_username varchar(25),
   enable_bbcode tinyint(1) DEFAULT '1' NOT NULL,
   enable_html tinyint(1) DEFAULT '0' NOT NULL,
   enable_smilies tinyint(1) DEFAULT '1' NOT NULL,
   enable_sig tinyint(1) DEFAULT '1' NOT NULL,
   post_edit_time int(11),
   post_edit_count smallint(5) UNSIGNED DEFAULT '0' NOT NULL,
   PRIMARY KEY (post_id),
   KEY forum_id (forum_id),
   KEY topic_id (topic_id),
   KEY poster_id (poster_id),
   KEY post_time (post_time)
);

The key on forum_id is designed to allow queries that hit only this forum to run quickly. The key on post_time is designed to allow the system to quickly identify posts via a post time (or a range of post times). You would think that in the case you posted, both of these indexes would be used to first identify posts from a specific forum and second to quickly find the maximum post time. However, database only ever uses one index at a time, so...that won't work.

Here's how you know this:
Code:
mysql> explain select max(post_time) from phpbb_posts where forum_id = 8;
+----+-------------+-------------+------+---------------+----------+---------+-------+------+-------+
| id | select_type | table       | type | possible_keys | key      | key_len | ref   | rows | Extra |
+----+-------------+-------------+------+---------------+----------+---------+-------+------+-------+
|  1 | SIMPLE      | phpbb_posts | ref  | forum_id      | forum_id | 2       | const | 2931 | NULL  |
+----+-------------+-------------+------+---------------+----------+---------+-------+------+-------+

I used forum_id = 8 because that's the largest forum we have on this site. It doesn't change the results. Now suppose that we try to use post_time, is there a way to do that?
Code:
mysql> explain select max(post_time) from phpbb_posts;
+----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                        |
+----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+
|  1 | SIMPLE      | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | Select tables optimized away |
+----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+

In this query I am only asking for the latest possible post_time. It's an incredibly efficient query! Notice the last line says "tables optimized away"? It means that the data needed to answer this query is found in the index itself, and it doesn't need to hit the table at all. Very effective, but it doesn't answer the actual question being asked, which is to identify the maximum post_time from a specific forum.

Here's one approach. It is highly likely that the last post_time will also correspond to the last post_id. The post_id is assigned when the post is created, and the post_time is captured at the same time. Can we cheat?
Code:
mysql> explain select max(post_id) from phpbb_posts where forum_id = 8;
+----+-------------+-------------+------+---------------+----------+---------+-------+------+-------+
| id | select_type | table       | type | possible_keys | key      | key_len | ref   | rows | Extra |
+----+-------------+-------------+------+---------------+----------+---------+-------+------+-------+
|  1 | SIMPLE      | phpbb_posts | ref  | forum_id      | forum_id | 2       | const | 2931 | NULL  |
+----+-------------+-------------+------+---------------+----------+---------+-------+------+-------+

Nope, no dice. The query optimizer still wants to use the index on forum_id. There is a way to avoid that...by changing the value of forum_id without really changing it.
Code:
mysql> explain select max(post_id) from phpbb_posts where forum_id+0 = 8;
+----+-------------+-------------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table       | type | possible_keys | key  | key_len | ref  | rows  | Extra       |
+----+-------------+-------------+------+---------------+------+---------+------+-------+-------------+
|  1 | SIMPLE      | phpbb_posts | ALL  | NULL          | NULL | NULL    | NULL | 10235 | Using where |
+----+-------------+-------------+------+---------------+------+---------+------+-------+-------------+

Well, that didn't work either. Now it's not using an index at all, not even the one on forum_id.

Here's where I originally thought I was going to solve the problem. I wanted to create a new index that has both of the elements of our query. The primary attribute is forum_id and the secondary attribute is post_time.
Code:
mysql> create index forum_id_post_time on phpbb_posts (forum_id, post_time);
Query OK, 10235 rows affected (0.26 sec)

Now let's run the same explain.
Code:
mysql> explain select max(post_id) from phpbb_posts where forum_id = 8;
+----+-------------+-------------+------+-----------------------------+----------+---------+-------+------+-------+
| id | select_type | table       | type | possible_keys               | key      | key_len | ref   | rows | Extra |
+----+-------------+-------------+------+-----------------------------+----------+---------+-------+------+-------+
|  1 | SIMPLE      | phpbb_posts | ref  | forum_id,forum_id_post_time | forum_id | 2       | const | 1490 | NULL  |
+----+-------------+-------------+------+-----------------------------+----------+---------+-------+------+-------+

Now it says it has two possible keys, but it opted to use the one based only on forum_id. Well, that didn't help. I tried swapping the order of the columns in the index and that didn't help either. I ended up dropping the index.

Back to the drawing board.

Ultimately the purpose of the code you posted is to obtain the last (maximum) post_time from the posts table for a specific forum. Look at the structure for the phpbb_forums table.
Code:
# --------------------------------------------------------
#
# Table structure for table 'phpbb_forums'
#
CREATE TABLE phpbb_forums (
   forum_id smallint(5) UNSIGNED NOT NULL,
   cat_id mediumint(8) UNSIGNED NOT NULL,
   forum_name varchar(150),
   forum_desc text,
   forum_status tinyint(4) DEFAULT '0' NOT NULL,
   forum_order mediumint(8) UNSIGNED DEFAULT '1' NOT NULL,
   forum_posts mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
   forum_topics mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
   forum_last_post_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
   prune_next int(11),
   prune_enable tinyint(1) DEFAULT '0' NOT NULL,
   auth_view tinyint(2) DEFAULT '0' NOT NULL,
   auth_read tinyint(2) DEFAULT '0' NOT NULL,
   auth_post tinyint(2) DEFAULT '0' NOT NULL,
   auth_reply tinyint(2) DEFAULT '0' NOT NULL,
   auth_edit tinyint(2) DEFAULT '0' NOT NULL,
   auth_delete tinyint(2) DEFAULT '0' NOT NULL,
   auth_sticky tinyint(2) DEFAULT '0' NOT NULL,
   auth_announce tinyint(2) DEFAULT '0' NOT NULL,
   auth_vote tinyint(2) DEFAULT '0' NOT NULL,
   auth_pollcreate tinyint(2) DEFAULT '0' NOT NULL,
   auth_attachments tinyint(2) DEFAULT '0' NOT NULL,
   PRIMARY KEY (forum_id),
   KEY forums_order (forum_order),
   KEY cat_id (cat_id),
   KEY forum_last_post_id (forum_last_post_id)
);

Now look at the structure for this same table for this site:
Code:
mysql> desc phpbb_forums;
+----------------------+-----------------------+------+-----+---------+-------+
| Field                | Type                  | Null | Key | Default | Extra |
+----------------------+-----------------------+------+-----+---------+-------+
| forum_id             | smallint(5) unsigned  | NO   | PRI | 0       |       |
| cat_id               | mediumint(8) unsigned | NO   | MUL | 0       |       |
| forum_name           | varchar(150)          | YES  |     | NULL    |       |
| forum_desc           | text                  | YES  |     | NULL    |       |
| forum_status         | tinyint(4)            | NO   |     | 0       |       |
| forum_order          | mediumint(8) unsigned | NO   | MUL | 1       |       |
| forum_posts          | mediumint(8) unsigned | NO   |     | 0       |       |
| forum_topics         | mediumint(8) unsigned | NO   |     | 0       |       |
| forum_last_post_id   | mediumint(8) unsigned | NO   | MUL | 0       |       |
| forum_last_post_time | int(11) unsigned      | NO   |     | 0       |       |
| forum_last_poster_id | mediumint(8)          | NO   |     | -1      |       |
| show_adsense         | tinyint(1)            | NO   |     | 1       |       |
| searchable           | tinyint(1)            | NO   |     | 1       |       |
| digestable           | tinyint(1)            | NO   |     | 1       |       |
| hideable             | tinyint(1)            | NO   |     | 1       |       |
| prune_next           | int(11)               | YES  |     | NULL    |       |
| prune_enable         | tinyint(1)            | NO   |     | 0       |       |
| forum_icon           | varchar(32)           | YES  |     | NULL    |       |
| post_count           | tinyint(1) unsigned   | YES  |     | 1       |       |
| show_sigs            | tinyint(1) unsigned   | NO   |     | 1       |       |
| auth_view            | tinyint(2)            | NO   |     | 0       |       |
| auth_read            | tinyint(2)            | NO   |     | 0       |       |
| auth_post            | tinyint(2)            | NO   |     | 0       |       |
| auth_reply           | tinyint(2)            | NO   |     | 0       |       |
| auth_edit            | tinyint(2)            | NO   |     | 0       |       |
| auth_delete          | tinyint(2)            | NO   |     | 0       |       |
| auth_sticky          | tinyint(2)            | NO   |     | 0       |       |
| auth_announce        | tinyint(2)            | NO   |     | 0       |       |
| auth_vote            | tinyint(2)            | NO   |     | 0       |       |
| auth_pollcreate      | tinyint(2)            | NO   |     | 0       |       |
| auth_attachments     | tinyint(2)            | NO   |     | 0       |       |
| auth_download        | tinyint(2)            | NO   |     | 0       |       |
| topic_points_enabled | tinyint(1) unsigned   | YES  |     | 1       |       |
+----------------------+-----------------------+------+-----+---------+-------+

Yup, there it is. Nestled right in that table, which has exactly one row per forum, is a column forum_last_post_time. Apparently I ran into the same problem, and this was my solution. There is already code in various places to update the forum_last_post_id and it was extremely simple to add the post_time to the same logic. If you do this, it would allow you to take the following code from view_forum.php:
Code:
        if ( $userdata['session_logged_in'] )
        {
                $sql = "SELECT MAX(post_time) AS last_post
                        FROM " . POSTS_TABLE . "
                        WHERE forum_id = $forum_id";

...and replace it with this:
Code:
        if ( $userdata['session_logged_in'] )
        {
                $sql = "SELECT forum_last_post_time AS last_post
                        FROM " . FORUMS_TABLE . "
                        WHERE forum_id = $forum_id";

There is code in includes/functions_post.php that handles the update:
Code:
$forum_update_sql .= ( $row['last_post_id'] ) ? ', forum_last_post_id = ' . $row['last_post_id'] . ', forum_last_poster_id = ' . $row['poster_id'] . ', forum_last_post_time = ' . $row['post_time'] : ', forum_last_post_id = 0';

This is not necessarily the only place; I did not have time to do an exhaustive search. But I know I did a lot of work to optimize queries when I first got started with phpBB2 and this is apparently one of the things that I did.

_________________
phpBBDoctor Blog
Back to top
b0blee
Board Member



Joined: 11 Jun 2012

Posts: 25
Location: Cloverdale, northern California



PostPosted: Mon Dec 21, 2020 5:05 pm 
Post subject: Re: The Slowest Query

Thank you so much! That was very informative. I will modify my site accordingly.
_________________
-𝕓𝕆𝕓- at The Steel Guitar Forum
Back to top
drathbun
Board Member



Joined: 24 Jul 2008

Posts: 716
Location: Texas


flag
PostPosted: Mon Dec 21, 2020 11:51 pm 
Post subject: Re: The Slowest Query

Please let me know if it helps! And feel free to post any other queries from your "slow query" log as I know I went through the same process over the years. There are probably several more performance tips that you can apply, if you can just point me in the right direction. icon_smile.gif
_________________
phpBBDoctor Blog
Back to top
b0blee
Board Member



Joined: 11 Jun 2012

Posts: 25
Location: Cloverdale, northern California



PostPosted: Tue Dec 22, 2020 12:17 am 
Post subject: Re: The Slowest Query

drathbun wrote:
Please let me know if it helps! And feel free to post any other queries from your "slow query" log as I know I went through the same process over the years. There are probably several more performance tips that you can apply, if you can just point me in the right direction. icon_smile.gif

I've made those two changes in the code and saw an immediate drop in CPU load. Could be a coincidence. We'll see what the slow query log looks like tomorrow.

Thanks!!!!

_________________
-𝕓𝕆𝕓- at The Steel Guitar Forum
Back to top
drathbun
Board Member



Joined: 24 Jul 2008

Posts: 716
Location: Texas


flag
PostPosted: Tue Dec 22, 2020 2:27 am 
Post subject: Re: The Slowest Query

Where do I send my invoice? icon_razz.gif

Thanks for the update, and glad it's helping. I look forward to the next challenge.

_________________
phpBBDoctor Blog
Back to top
b0blee
Board Member



Joined: 11 Jun 2012

Posts: 25
Location: Cloverdale, northern California



PostPosted: Wed Dec 23, 2020 7:57 am 
Post subject: Re: The Slowest Query

Having made those changes, it seems that the "Mark all topics read" function no longer works. Maybe it's something I messed up - I don't know. I'm not good with databases. icon_redface.gif

But just checking - is there more code that I need to change?

_________________
-𝕓𝕆𝕓- at The Steel Guitar Forum
Back to top
drathbun
Board Member



Joined: 24 Jul 2008

Posts: 716
Location: Texas


flag
PostPosted: Fri Dec 25, 2020 8:32 pm 
Post subject: Re: The Slowest Query

Did you add the new column to the PHPBB_FORUMS table? I don't think I explicitly told you to do that, but it's necessary. After you do that (add the column) you would want to update the records with the proper data as it stands. Then the update change I gave you should keep the field updated as new posts are stored.
_________________
phpBBDoctor Blog
Back to top
b0blee
Board Member



Joined: 11 Jun 2012

Posts: 25
Location: Cloverdale, northern California



PostPosted: Sat Dec 26, 2020 5:17 am 
Post subject: Re: The Slowest Query

drathbun wrote:
Did you add the new column to the PHPBB_FORUMS table? I don't think I explicitly told you to do that, but it's necessary. After you do that (add the column) you would want to update the records with the proper data as it stands.


I did add the column, but it isn't being updated. All zeros. How do I "update the records with the proper data as it stands"?

_________________
-𝕓𝕆𝕓- at The Steel Guitar Forum
Back to top
drathbun
Board Member



Joined: 24 Jul 2008

Posts: 716
Location: Texas


flag
PostPosted: Sat Dec 26, 2020 6:27 am 
Post subject: Re: The Slowest Query

Okay, probably two things...the value $row['last_post_id'] isn't being set, which would handle the updates, and to get it set initially you would need to run a SQL script. I will see if I can check and provide updates for both things for you tomorrow.
_________________
phpBBDoctor Blog
Back to top
b0blee
Board Member



Joined: 11 Jun 2012

Posts: 25
Location: Cloverdale, northern California



PostPosted: Sat Dec 26, 2020 4:44 pm 
Post subject: Re: The Slowest Query

While I realize that our line numbers won't coincide, where exactly does that code in functions_post.php go? I just discovered that I had put it in the if ($mode == 'delete') block which obviously isn't correct, but I don't see another place where $row is in scope.

Also, I notice another column in your code that I don't have: forum_last_poster_id. Is it necessary, or can I simply remove it from the query?

Sorry to be such a bother. icon_redface.gif

_________________
-𝕓𝕆𝕓- at The Steel Guitar Forum
Back to top
drathbun
Board Member



Joined: 24 Jul 2008

Posts: 716
Location: Texas


flag
PostPosted: Sat Dec 26, 2020 4:56 pm 
Post subject: Re: The Slowest Query

Here's the SQL to update the table:
Code:
update phpbb_forums
set forum_last_post_time =
(select post_time
from phpbb_posts
where phpbb_posts.post_id = phpbb_forums.forum_last_post_id)

Once you have done that, the phpbb_forums table (which you have a different prefix other than "phpbb_" but I think you realize that?) will have updated last_post_time information, rather than zeroes. Next, here's another change that should help. Back in includes/functions_post.php find this:
Code:
         if ($post_data['last_topic'])
         {
            $sql = "SELECT MAX(post_id) AS last_post_id
               FROM " . POSTS_TABLE . "
               WHERE forum_id = $forum_id";
            if (!($result = $db->sql_query($sql)))
            {
               message_die(GENERAL_ERROR, 'Error in deleting post', '', __LINE__, __FILE__, $sql);
            }

            if ($row = $db->sql_fetchrow($result))
            {
               $forum_update_sql .= ($row['last_post_id']) ? ', forum_last_post_id = ' . $row['last_post_id'] : ', forum_last_post_id = 0';
            }
         }

Some of that (the last part) has already been updated. The first part (the query) needs to be modified to return the post_time, otherwise nothing ever gets set. I am talking specifically about this part:
Code:
         if ($post_data['last_topic'])
         {
            $sql = "SELECT MAX(post_id) AS last_post_id
               FROM " . POSTS_TABLE . "
               WHERE forum_id = $forum_id";
            if (!($result = $db->sql_query($sql)))

It should include new columns in the SQL, like this:
Code:
                        if ( $post_data['last_topic'] )
                        {
                                $sql = "SELECT  post_id AS last_post_id
                                        ,       post_time
                                        ,       poster_id
                                        FROM    " . POSTS_TABLE . "
                                        WHERE post_id = (
                                                SELECT  MAX(post_id)
                                                FROM    " . FORUMS_TABLE . "
                                                WHERE   forum_id = $forum_id)";

Note that the structure of this SQL is completely changed...it now includes a sub-query. This query is responsible for obtaining the value for post_time, which is then stored using the adjustment provided previously. Specifically here:
Code:
if ( $row = $db->sql_fetchrow($result) )
                                {
                                        $forum_update_sql .= ( $row['last_post_id'] ) ? ', forum_last_post_id = ' . $row['last_post_id'] . ', forum_last_poster_id = ' . $row['poster_id'] . ', forum_last_post_time = ' . $row['post_time'] : ', forum_last_post_id = 0';
                                }

I think that's everything now. Please let me know if not!

Happy holidays.

_________________
phpBBDoctor Blog
Back to top
drathbun
Board Member



Joined: 24 Jul 2008

Posts: 716
Location: Texas


flag
PostPosted: Sat Dec 26, 2020 4:58 pm 
Post subject: Re: The Slowest Query

b0blee wrote:
While I realize that our line numbers won't coincide, where exactly does that code in functions_post.php go? I just discovered that I had put it in the if ($mode == 'delete') block which obviously isn't correct, but I don't see another place where $row is in scope.

I posted more code just now. Let me know if it's specific enough for you to find.
Quote:
Also, I notice another column in your code that I don't have: forum_last_poster_id. Is it necessary, or can I simply remove it from the query?

It's not necessary; it's another performance enhancement. It basically retrieves the "who" as well as the "when" for the last post in the forum and stores it the same way.

_________________
phpBBDoctor Blog
Back to top
b0blee
Board Member



Joined: 11 Jun 2012

Posts: 25
Location: Cloverdale, northern California



PostPosted: Sat Dec 26, 2020 5:14 pm 
Post subject: Re: The Slowest Query

Still confused. That if ($post_data['last_topic']) block is inside the if ($mode == 'delete') block. Wouldn't it only be called when deleting a post? Or am I working from an obsolete file (phpBB 2.0.22)?

BTW, the SQL script worked beautifully. icon_smile.gif

_________________
-𝕓𝕆𝕓- at The Steel Guitar Forum
Back to top
drathbun
Board Member



Joined: 24 Jul 2008

Posts: 716
Location: Texas


flag
PostPosted: Sat Dec 26, 2020 5:49 pm 
Post subject: Re: The Slowest Query

I added more code to the post above. It's not in the "delete" box it's in the 'last_topic' update.
Code:
                        if ( $post_data['last_topic'] )
                        {
                                $sql = "SELECT  post_id AS last_post_id
                                        ,       post_time
                                        ,       poster_id
                                        FROM    " . POSTS_TABLE . "
                                        WHERE post_id = (
                                                SELECT  MAX(post_id)
                                                FROM    " . FORUMS_TABLE . "
                                                WHERE   forum_id = $forum_id)";
                                if ( !($result = $db->sql_query($sql)) )
                                {
                                        message_die(GENERAL_ERROR, 'Error in deleting post', '', __LINE__, __FILE__, $sql);
                                }

                                if ( $row = $db->sql_fetchrow($result) )
                                {
                                        $forum_update_sql .= ( $row['last_post_id'] ) ? ', forum_last_post_id = ' . $row['last_post_id'] . ', forum_last_poster_id = ' . $row['poster_id'] . ', forum_last_post_time = ' . $row['post_time'] : ', forum_last_post_id = 0';
                                }
                        }


Edit

Ah, I see now. Yes, the parent block is indeed looking at deleted topics. So that code is still important / necessary, but still not complete. There is another block of code somewhere that deals with inserted (new) posts. Let me find that.

_________________
phpBBDoctor Blog
Back to top
Display posts from previous:   
Register or Login to Post    Index » General Support  Previous TopicPrint TopicNext Topic
Page 1 of 2 All times are GMT
Goto page 1, 2  Next
 
Jump to:  

Index • About • FAQ • Rules • Privacy • Search •  Register •  Login 
Not affiliated with or endorsed by the phpBB Group
Powered by phpBB2 © phpBB Group
Generated in 0.1018 seconds using 16 queries. (SQL 0.0019 Parse 0.0681 Other 0.0318)
phpBB Customizations by the phpBBDoctor.com
Template Design by DeLFlo and MomentsOfLight.com Moments of Light Logo