2016-03-23 3 views
0

Вот моя проблема, я выбираю и делаю несколько объединений, чтобы получить правильный элемент.Ускорить запрос MySQL с несколькими объединениями

Кто-нибудь знает, как я могу ускорить это? Это займет около 19 секунд?

Вот запрос.

SELECT 
     t1.id AS HostingID, 
     t5.date_id AS DateRelid 
    FROM 
     tblhosting AS t1 
     INNER JOIN tblcustomfieldsvalues AS t2 ON t1.id = t2.relid 
     INNER JOIN tblcustomfields AS t3 ON t2.fieldid = t3.id 
     INNER JOIN tbl_course AS t4 ON t1.packageid = t4.course_pid 
     INNER JOIN tbl_dates AS t5 ON t4.course_title = t5.date_coursetitle 
    WHERE 
     t3.fieldname LIKE "%Course Date%" AND 
     t1.id = "$hostingid" AND 
     t1.userid = "$userid" AND 
     t5.date_coursedisplay = t2.value AND 
     t5.date_courselocation = t4.course_location 
    ORDER BY t5.date_id DESC 
     LIMIT 0 , 1 

Я не самый большой с MySQL, так что любая помощь будет оценен по достоинству!

Заранее благодарен!

ОБЪЯСНИТЬ Of My SQL:

id select_type  table  type possible_keys      key   key_len  ref       rows  Extra 
1 SIMPLE   t1  const PRIMARY,serviceid,userid,productid PRIMARY  4   const       1  Using temporary; Using filesort 
1 SIMPLE   t5  ALL  NULL         NULL   NULL  NULL       20744 
1 SIMPLE   t3  ALL  PRIMARY        NULL   NULL  NULL       4101  Using where; Using join buffer 
1 SIMPLE   t2  ref  fieldid_relid      fieldid_relid 8   nextstep_next.t3.id,const  1  Using where 
1 SIMPLE   t4  ALL  NULL         NULL   NULL  NULL       664  Using where; Using join buffer 
+0

Не могли бы вы предоставить дополнительную информацию: структура ваших таблиц, приблизительное количество строк в каждом? – Loufylouf

+0

't1 - ID \t \t идентификатор OrderID \t \t PackageID сервер \t regdate - 16000 rows' ' t2 - fieldid relid значение - 80000 Rows' 't3 - \t \t идентификатор типа \t \t relid имя_поля \t \t FieldType Описание \t \t fieldoptions RegExpr \t \t adminonly необходимые \t \t showorder showinvoice \t sortorde - 5000 rows' 't4 - Полный текст \t \t course_id COURSE_TITLE \t Кур se_location \t \t course_pid course_venue \t course_note - 500 rows' 't5 - Полные тексты \t \t date_id date_select \t \t date_courselocation date_coursetitle \t date_coursedisplay - 21000 rows' @Loufylouf надеюсь, что это помогает, его база данных WHMCS с пользовательскими таблицами –

+1

читаемый формат будет путь лучше, чем это. Как правильно отредактированный 'CREATE TABLE', это даст нам разные типы ваших столбцов, а также способ быстро создать ваши таблицы для тестирования. И такая информация действительно важна, поэтому было бы лучше добавить ее к вашему вопросу, чем здесь, в комментариях. – Loufylouf

ответ

0

Я думаю, что уточнение по показателям поможет. Это все еще довольно кратковременно для контекста для подтверждения. Я предлагаю следующие индексы для оптимизации.

Table     index 
tblHosting   (id, userid, packageid) 
tblcustomfieldsvalues (relid, fieldid, value) 
tblcustomfields  (id, fieldname) 
tbl_course   (course_pid) 
tbl_dates    (date_coursetitle, date_courselocation, date_coursedisplay) 

По крайней мере, с таблицей tblcustomfields, он может быть частично оптимизированы с помощью столбца ID, а затем имя поля.

Большинство этих индексов охватывают индексы, означающие, что им не нужно возвращаться к необработанным страницам данных для завершения объединения, он может напрямую захватывать все данные из индексов.

Смежные вопросы