Что не так с моим индексом по этому запросу MySQL? - PullRequest
0 голосов
/ 26 июля 2010
select
                xml_record_product.product_id, 
                IfNull(xml_record_product.product_short_description,xml_record_product.product_description) AS BookDescription, 
                xml_record_product.product_image, 
                xml_record_product.product_publisher_name AS Publisher, 
                xml_record_product.product_title AS BookTitle, 
                xml_record_product.product_form, 
                xml_record_product.product_num_pages, 
                xml_record_product.product_BASICMainSubject, 
                xml_record_product.product_BICMainSubject, 
                xml_record_product.product_audience_code, 
                xml_record_product.product_country_of_publication, 
                xml_record_product.product_publishing_status, 
                xml_record_product.product_publication_date AS BookDate, 
                xml_record_product.product_imprint, 
                xml_record_product.product_active, 
                xml_record_product.product_isFeatured, 
                xml_record_product.product_isNewArival, 
                xml_record_product.product_short_description, 
                xml_record_product.product_description, 
                xml_record_product.product_isbn13 AS ISBN,
                xml_record_subject.subject_heading_text
                FROM xml_record_product 
                inner join xml_record_contributor ON xml_record_product.product_id = xml_record_contributor.product_id
                inner join xml_record_subject on xml_record_contributor.product_id = xml_record_subject.product_id
                inner join xml_record_supplier on xml_record_product.product_id = xml_record_supplier.product_id AND supplier_price > 0
                where contributor_title like '%josh%'
                order by xml_record_product.product_publication_date DESC limit 20;

Дает:

SIMPLE xml_record_supplier index sup_product_id sup_product_id 265  895424 Using where; Using index; Using temporary; Using filesort

SIMPLE xml_record_subject ref product_id_sub product_id_sub 8 mysupplier1.xml_record_supplier.product_id 1 

SIMPLE xml_record_product eq_ref PRIMARY PRIMARY 8 mysupplier1.xml_record_supplier.product_id 

SIMPLE xml_record_contributor ref cont_product_id cont_product_id 8 mysupplier1.xml_record_subject.product_id 1 Using where

Но если я извлекаю внутреннее объединение для xml_record_supplier, я получаю это:

SIMPLE xml_record_product index PRIMARY pub_date 265  20 

SIMPLE xml_record_subject ref product_id_sub product_id_sub 8 mysupplier1.xml_record_product.product_id 1 

SIMPLE xml_record_contributor ref cont_product_id cont_product_id 8 mysupplier1.xml_record_subject.product_id 1 Using where

Мне нужно знать, почему это происходит, икак это можно предотвратить?Насколько я понял, EXPLAIN будет показывать таблицы, считываемые последовательно из внутреннего соединения.Этого не происходит, и я удостоверился, что у меня установлен индекс product_id для этих запросов (для xml_record_contributor - это сочетание product_id и contributor_id)

В xml_record_supplier у меня есть product_id и supplier_price в индексе (тем не менее, я пробовал много комбинаций, думаю, ВСЕ из них)

Есть идеи, что я могу попробовать?Мне нужно ограничить выбор поставщиками с ценой выше 0, и с добавлением этого внутреннего соединения оно быстро выходит из-под контроля.

Спасибо за любой вклад!

/ edit- здесь описаны все таблицы

xml_record_product (index is product_id,product_publication_date desc)

product_id  bigint(20)  NO  PRI     auto_increment
    product_isbn13  bigint(13)  NO          
    product_form    varchar(255)    NO          
    product_num_pages   int(11) NO          
    product_BASICMainSubject    varchar(255)    NO          
    product_BICMainSubject  varchar(255)    NO          
    product_audience_code   int(11) NO          
    product_country_of_publication  varchar(255)    NO          
    product_publishing_status   int(11) NO          
    product_publication_date    varchar(255)    NO  MUL     
    product_short_description   varchar(350)    NO          
    product_description text    NO          
    product_imprint varchar(255)    NO          
    product_image   varchar(255)    NO          
    product_publisher_name  varchar(255)    NO          
    product_title   varchar(255)    NO          
    product_active  int(11) NO      1   
    cat_id  int(11) NO          
    product_isFeatured  int(11) NO          
    product_isNewArival int(11) NO  

xml_record_contributor (индекс - product_id, contributor_id)

contributor_id  int(11) NO  PRI     auto_increment
product_id  bigint(20)  NO  MUL     
contributor_title   varchar(255)    NO          

xml_record_supplier (индекс - product_id, supplier_id, supplier_price)

supplier_id int(11) NO  PRI     auto_increment
product_id  bigint(20)  NO  MUL     
supplier_name   varchar(255)    NO          
supplier_product_availability   int(11) NO          
supplier_price  varchar(255)    NO          
supplier_currency_code  varchar(255)    NO          
supplier_supply_to  varchar(255)    NO          
supplier_price_status   varchar(255)    NO          
Description text    NO          
URL varchar(255)    NO          
Image1  varchar(255)    NO          
Image1_sml  varchar(255)    NO          
Image1Alt   varchar(255)    NO          

xml_record_subject (index: subject_id, product_id)

subject_id  int(11) NO  PRI     auto_increment
product_id  bigint(20)  NO  MUL     
subject_heading_text    varchar(255)    YES MUL     
ParentID    varchar(20) NO  

РЕДАКТИРОВАТЬ

Вот ИНДЕКС ПОКАЗАТЕЛЯ ОТ xml_record_supplier

xml_record_supplier 1   sup_product_id  1   product_id  A   447712              BTREE
xml_record_supplier 1   sup_product_id  2   supplier_id A   895424              BTREE
xml_record_supplier 1   sup_product_id  3   supplier_price  A   895424              BTREE

1 Ответ

0 голосов
/ 26 июля 2010

Можете ли вы опубликовать таблицу DESCRIBE, чтобы мы могли видеть ваши индексы и структуру таблицы?

Я всегда сохраняю свои объединения как можно более простыми.Переместите supplier_price> 0 в условие WHERE.Я предполагаю из-за того условия, что MySQL пытается использовать индекс в xml_record_supplier.В результате он не может использовать индекс для product_publication_date, что означает, что он должен сортировать без индекса.Если это так, не существует простого решения, так как вы не можете создать составной индекс с полями из разных таблиц.

Планировщик MySQL предпочитает уменьшить количество строк, чем оптимизировать для ORDER BY.В зависимости от количества результатов, строк в таблице и количества элементов, избавление от сортировки файлов может быть быстрее.Попробуйте использовать FORCE INDEX (Composite_index_on_title_and_date), чтобы избавиться от сортировки файлов и сравнить результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...