Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 291295
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 12, 20262026-05-12T06:04:34+00:00 2026-05-12T06:04:34+00:00

I have a browse category query that im trying to optimize. Im ending up

  • 0

I have a browse category query that im trying to optimize. Im ending up with Using temporary; Using filesort in the explain and the query is slow on a category with say 60,000 rows. If i remove the Order By clauses the query runs very fast .05 seconds to do 60,000 rows. With the Order By clauses its very slow around 5 seconds. Parts contains some 500,000 rows as does Parts_Category.

I have a group index on Parts (status, level, warehouse, updated) called sort_index

At the top of the explain I have | ALL | Using temporary; Using filesort

All the other indexes are showing OK. Can somebody please tell me what the problem might be? Im out of ideas. Maybe i should rearrange this query so i can get better performance perhaps?

query.

SELECT Parts.*, Image.type, Image.width, Image.height,
(SELECT name FROM Location_State WHERE id = Parts.state_id) AS state, 
(SELECT name FROM Location_Region WHERE id = Parts.region_id) AS region, 
(SELECT start_date FROM Promotion WHERE id = Parts.promotion_id) AS promotion_start_date, 
(SELECT end_date FROM Promotion WHERE id = Parts.promotion_id) AS promotion_end_date 
FROM ( SELECT parts_id FROM Parts_Category WHERE Parts_Category.category_id = '40' 
UNION SELECT parts_id FROM Parts_Category WHERE Parts_Category.main_category_id = '40') cid 
LEFT JOIN Image ON Parts.image_id = Image.id
JOIN Parts ON Parts.id = cid.parts_id AND Parts.status = 'A'
ORDER BY Parts.level DESC, Parts.warehouse DESC, Parts.updated DESC LIMIT 0, 15
Table structure for table Parts

Field   Type    Null    Default
id  int(11) No  auto_increment
image_id    int(11) Yes 0
gallery_id  int(11) Yes 0
image_count int(3)  Yes 0
promotion_id    int(11) Yes 0
country_id  int(11) Yes NULL
state_id    int(11) Yes NULL
region_id   int(11) Yes NULL
city_id int(11) Yes NULL
area_id int(11) Yes NULL
updated datetime    Yes 0000-00-00 00:00:00
entered datetime    Yes 0000-00-00 00:00:00
renewal_date    date    Yes 0000-00-00
discount_id varchar(10) Yes NULL
title           varchar(100)    Yes 
search_title    varchar(255)    Yes 
warehouse   varchar(50) Yes 
url varchar(255)    Yes 
display_url varchar(255)    Yes 
friendly_url    varchar(100)    Yes NULL
description varchar(255)    Yes 
keywords    varchar(1000)   Yes NULL
attachment_file varchar(255)    Yes 
attachment_caption  varchar(255)    Yes 
status  char(1) Yes 
level   tinyint(3)  Yes 0
worldwide   tinyint(1)  Yes 0
random_number   int(11) Yes NULL
reminder    tinyint(4)  Yes NULL
category_search varchar(1000)   Yes 
video_snippet   varchar(1000)   Yes 
importID    int(11) Yes 0

Indexes

PRIMARY             518623       id
random_number INDEX 32201   random_number
country_id  INDEX   1       country_id
state_id    INDEX   8       state_id
region_id   INDEX   5       region_id
renewal_date    INDEX   1       renewal_date
worldwide   INDEX   1       worldwide
friendly_url    INDEX   518623      friendly_url
promotion_id    INDEX   1       promotion_id
city_id         INDEX   1   city_id
area_id     INDEX   1       area_id
zip_code    INDEX   2790        zip_code
importID    INDEX   518623      importID
image_id    INDEX   10          image_id

--------------
index_browse_category   INDEX   52 
level
status
warehouse   
updated
-----------------
keywords    FULLTEXT    1 
description
keywords
category_search 


Parts_Category

id              int(11)         No   auto_increment     
parts_id        int(11)             No  0       
category_id         int(11)             No  0       
main_category_id    int(10)             No  0   

Index

PRIMARY          PRIMARY    519330           id
category_id          INDEX  519330          category_id
parts_id
main_category_id     INDEX  519330              main_category_id
parts_id





  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-12T06:04:34+00:00Added an answer on May 12, 2026 at 6:04 am

    Try rewriting your query as this:

    SELECT  p.*, i.type, i.width, i.height,
            (SELECT name FROM Location_State WHERE id = p.state_id) AS state, 
            (SELECT name FROM Location_Region WHERE id = p.region_id) AS region, 
            (SELECT start_date FROM Promotion WHERE id = p.promotion_id) AS promotion_start_date, 
            (SELECT end_date FROM Promotion WHERE id = p.promotion_id) AS promotion_end_date 
    FROM    parts p
    LEFT JOIN
            image i
    ON      i.id = p.image_id
    WHERE   EXISTS (
            SELECT  NULL
            FROM    Parts_Category pc
            WHERE   pc.category_id = '40'
                    AND pc.parts_id = p.id
            UNION ALL
            SELECT  NULL
            FROM    Parts_Category pc
            WHERE   pc.main_category_id = '40'
                    AND pc.parts_id = p.id
            )
            AND p.status = 'A'
    ORDER BY
            p.status DESC, p.level DESC, p.warehouse DESC, p.updated DESC
    LIMIT   15
    

    You need the following indexes for this to work efficiently:

    parts (status, level, warehouse, updated) -- this one you have
    parts_category (category_id, parts_id)
    parts_category (main_category_id, parts_id)
    

    Update:

    I just created the tables as this:

    DROP TABLE IF EXISTS `test`.`image`;
    CREATE TABLE  `test`.`image` (
      `id` int(11) NOT NULL,
      `type` int(11) NOT NULL,
      `width` int(11) NOT NULL,
      `height` int(11) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    DROP TABLE IF EXISTS `test`.`location_region`;
    CREATE TABLE  `test`.`location_region` (
      `id` int(11) NOT NULL,
      `name` varchar(20) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    DROP TABLE IF EXISTS `test`.`location_state`;
    CREATE TABLE  `test`.`location_state` (
      `id` int(11) NOT NULL,
      `name` varchar(20) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    DROP TABLE IF EXISTS `test`.`parts`;
    CREATE TABLE  `test`.`parts` (
      `id` int(11) NOT NULL,
      `status` char(1) NOT NULL,
      `level` int(11) NOT NULL,
      `warehouse` int(11) NOT NULL,
      `updated` int(11) NOT NULL,
      `state_id` int(11) NOT NULL,
      `region_id` int(11) NOT NULL,
      `promotion_id` int(11) NOT NULL,
      `image_id` int(11) NOT NULL DEFAULT '1',
      PRIMARY KEY (`id`),
      KEY `status` (`status`,`level`,`warehouse`,`updated`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    DROP TABLE IF EXISTS `test`.`parts_category`;
    CREATE TABLE  `test`.`parts_category` (
      `id` int(11) NOT NULL,
      `parts_id` int(11) NOT NULL,
      `category_id` int(11) NOT NULL,
      `main_category_id` int(11) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `ix_pc_cat_parts` (`category_id`,`parts_id`),
      KEY `ix_pc_main_parts` (`main_category_id`,`parts_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    DROP TABLE IF EXISTS `test`.`promotion`;
    CREATE TABLE  `test`.`promotion` (
      `id` int(11) NOT NULL,
      `start_date` datetime NOT NULL,
      `end_date` datetime NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    and filled them with sample data:

    INSERT
    INTO    parts
    SELECT  id,
            CASE WHEN RAND() < 0.1 THEN 'A' ELSE 'B' END,
            RAND() * 100,
            RAND() * 100,
            RAND() * 100,
            RAND() * 50,
            RAND() * 50,
            RAND() * 50,
            RAND() * 50
    FROM    t_source
    LIMIT 500000;
    INSERT
    INTO    parts_category
    SELECT  id,
            id,
            RAND() * 100,
            RAND() * 100
    FROM    t_source
    LIMIT 500000;
    INSERT
    INTO    location_state
    SELECT  id, CONCAT('State ', id)
    FROM    t_source
    LIMIT 1000;
    INSERT
    INTO    location_region
    SELECT  id, CONCAT('Region ', id)
    FROM    t_source
    LIMIT 1000;
    INSERT
    INTO    promotion
    SELECT  id,
            '2009-07-22' - INTERVAL RAND() * 5 - 20 DAY,
            '2009-07-22' - INTERVAL RAND() * 5 DAY
    FROM    t_source
    LIMIT 1000;
    

    The query above runs for 30 milliseconds and yields the following plan:

    1, 'PRIMARY', 'p', 'ref', 'status', 'status', '3', 'const', 107408, 'Using where'
    1, 'PRIMARY', 'i', 'eq_ref', 'PRIMARY', 'PRIMARY', '4', 'test.p.image_id', 1, ''
    6, 'DEPENDENT SUBQUERY', 'pc', 'ref', 'ix_pc_cat_parts', 'ix_pc_cat_parts', '8', 'const,test.p.id', 1, 'Using index'
    7, 'DEPENDENT UNION', 'pc', 'ref', 'ix_pc_main_parts', 'ix_pc_main_parts', '8', 'const,test.p.id', 1, 'Using index'
    , 'UNION RESULT', '<union6,7>', 'ALL', '', '', '', '', , ''
    5, 'DEPENDENT SUBQUERY', 'Promotion', 'eq_ref', 'PRIMARY', 'PRIMARY', '4', 'test.p.promotion_id', 1, ''
    4, 'DEPENDENT SUBQUERY', 'Promotion', 'eq_ref', 'PRIMARY', 'PRIMARY', '4', 'test.p.promotion_id', 1, ''
    3, 'DEPENDENT SUBQUERY', 'Location_Region', 'eq_ref', 'PRIMARY', 'PRIMARY', '4', 'test.p.region_id', 1, ''
    2, 'DEPENDENT SUBQUERY', 'Location_State', 'eq_ref', 'PRIMARY', 'PRIMARY', '4', 'test.p.state_id', 1, ''
    

    As you can see, no temporary, no filesort, everything’s very fast.

    To help you anymore, I just need to see how your tables are defined.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Ask A Question

Stats

  • Questions 156k
  • Answers 156k
  • Best Answers 0
  • User 1
  • Popular
  • Answers
  • Editorial Team

    How to approach applying for a job at a company ...

    • 7 Answers
  • Editorial Team

    How to handle personal stress caused by utterly incompetent and ...

    • 5 Answers
  • Editorial Team

    What is a programmer’s life like?

    • 5 Answers
  • Editorial Team
    Editorial Team added an answer There's something better than alignment: layouts! You can create layouts… May 12, 2026 at 10:49 am
  • Editorial Team
    Editorial Team added an answer This is not possible. May 12, 2026 at 10:49 am
  • Editorial Team
    Editorial Team added an answer It must be some misconfiguration or another issue on your… May 12, 2026 at 10:49 am

Related Questions

I've been having a look at several MVC frameworks (like rails, merb, cakephp, codeignitier,
I am using CODBCRecordset (a class found on CodeProject) to find a single record
I have a style for styling <a> elements in list items in a #navigation
I have a variable, $id , which identifies the product category type to display
I have a Django model with a large number of fields and 20000+ table

Trending Tags

analytics british company computer developers django employee employer english facebook french google interview javascript language life php programmer programs salary

Top Members

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.