Complex query/index optimisation

Discussion in 'MySQL' started by zlos, Mar 25, 2006.

  1. #1
    Hi

    I am new to this forum, but I can see many strongheads here. Since over a year I fight with my software provider, which cannot really solve the issue with a killer query.

    Hope one of you, with a brand new insight into the story will find some sort of solution. Let me go into details:

    Killer query is:
    With EXPLAIN it brings following results:

    By that I can see that real problem is indexation of (re) 18brating_entries table. Let me give you insight into this:


    Anybody has any idea how to correct query/indexation to make it fly?


    Thanks in advance for any comments and idea exchange.


    Tom Zlos
     
    zlos, Mar 25, 2006 IP
  2. zlos

    zlos Peon

    Messages:
    6
    Likes Received:
    1
    Best Answers:
    0
    Trophy Points:
    0
    #2
    Almost forgotten :)

    Environment: MySQL 4.1.16 over PHP 4.3.11 and Apache 2.0.55
    Hardware: cluster of 3 webs with a multiple CPU's mysql machine behind
     
    zlos, Mar 25, 2006 IP
  3. sacx13

    sacx13 Active Member

    Messages:
    438
    Likes Received:
    10
    Best Answers:
    0
    Trophy Points:
    58
    #3
    1. Try to use left join first ...
    2. Look at mysql configuration file and try to optimize that (mysql have by default some conf files for loaded sites or big databases).

    Try my query and tell me how is working :

    
    SELECT AVG(re.rating_value) AS avgscore, r. * , r.date_added AS date_review_added, i. * , v. *
    FROM 18breviews AS r left join 18bitems AS i on r.item_id = i.item_id left join 18bvendors AS v on v.vendor_id = i.vendor_id left join 18brating_entries AS re  on re.review_id = r.review_id WHERE i.active =1 AND r.active =1
    GROUP BY r.review_id
    ORDER BY r.date_added DESC
    LIMIT 5
    
    Code (markup):

    I make a simple change on your table columns: I supposed rebvew_id is from table 18breviews

    Best Regards
    Adrian
    http://www.mydomaintracker.net
     
    sacx13, Mar 26, 2006 IP
  4. zlos

    zlos Peon

    Messages:
    6
    Likes Received:
    1
    Best Answers:
    0
    Trophy Points:
    0
    #4
    First trial:
    but let's have a look on the second run of the query (query cache is amazing thing :) )

    Assuming: 2nd run is fine, but the first one is the real pain... Especially due to the fact, that database changes 10 times per minute and query cache is not helping then...


    Regarding mysql configuration, what would you change there knowing I am running 2x 2.8GHz Xeon with 2GB RAM?

    Here comes my my.cnf file:
    Regards
    Tom
     
    zlos, Mar 26, 2006 IP
  5. sacx13

    sacx13 Active Member

    Messages:
    438
    Likes Received:
    10
    Best Answers:
    0
    Trophy Points:
    58
    #5
    Mysql have some predifined files for small/medium/large/huge mysql servers.

    This values are from there:

    set-variable = key_buffer=384M
    set-variable = max_allowed_packet=32M
    set-variable = table_cache=512
    set-variable = join_buffer=16M
    set-variable = sort_buffer=16M
    set-variable = myisam_sort_buffer_size=64M
    set-variable = range_alloc_block=3072
    set-variable = tmp_table_size=64M
    set-variable = record_buffer=16M
    set-variable = thread_cache=384
    set-variable = thread_concurency=4
     
    sacx13, Mar 29, 2006 IP
  6. noppid

    noppid gunnin' for the quota

    Messages:
    4,246
    Likes Received:
    232
    Best Answers:
    0
    Trophy Points:
    135
    #6
    How can we optimize this query when we only know the structure of one table?

    We need to check the indexes as well as the relationships.
     
    noppid, Mar 29, 2006 IP
  7. sacx13

    sacx13 Active Member

    Messages:
    438
    Likes Received:
    10
    Best Answers:
    0
    Trophy Points:
    58
    #7
    I impossible to make the query fly if you know only 1 table from all ... but you dont have access at this database ? or ?

    Regards
    Adrian
     
    sacx13, Mar 29, 2006 IP