Reply to thread

I'm not sure if this should be considered bug or improvement request , I run a forum where [CODE]xf_reaction_content[/CODE] has more than 24M records , my slow query log is full with

[CODE=sql]

SELECT content.reaction_id, COUNT(*)

            FROM xf_reaction_content AS content

            FORCE INDEX (content_user_id_reaction_date)

            INNER JOIN xf_reaction AS reaction ON

                (content.reaction_id = reaction.reaction_id)

            WHERE content.content_user_id = '125'

                AND reaction.active = 1

                AND content.is_counted = 1

            GROUP BY content.reaction_id

            ORDER BY reaction.display_order;[/CODE]


This query takes about 16 seconds on a powerful server

after applying some optimizations it now takes only 0.2 seconds

suggested optimizations include

1 - creating optimal indexes

[CODE]

ALTER TABLE `xf_reaction` ADD INDEX `xf_reaction_idx_active_reaction_id` (`active`,`reaction_id`);

ALTER TABLE `xf_reaction_content` ADD INDEX `xf_reaction_content_idx_content_id_is_counted_reaction_id` (`content_user_id`,`is_counted`,`reaction_id`);

 [/CODE]


2- Avoiding Optimizer Hints

[CODE=sql]FORCE INDEX (content_user_id_reaction_date)[/CODE]

causes performance degradation.


3- Avoiding type casting

while preparing query , method [CODE]fetchPairs()[/CODE] converted [CODE]$userId[/CODE] to string , this prevents MySQL using index if column is indexed


Back
Top Bottom