Как можно оптимизировать данный MySQL запрос?

Тема в разделе "Базы данных", создана пользователем new_forward, 30 июл 2015.

Модераторы: latteo
  1. new_forward

    new_forward

    Регистр.:
    5 май 2008
    Сообщения:
    668
    Симпатии:
    44
    Доброго времени суток, есть запрос который обрабатывается достаточно долго, бывает до 50 секунд, как его можно оптимизировать?

    Код:
    SELECT id, autor, date, short_story, SUBSTRING( full_story, 1, 15 ) AS full_story, xfields, title, category, alt_name, comm_num, allow_comm, allow_rate,
    FIXED , rating, vote_num, news_read, flag, editdate, editor, reason, view_edit, tags
    FROM dle_post
    WHERE approve
    AND allow_main
    AND date < '2015-07-30 01:53:48'
    ORDER BY date DESC
    LIMIT 20055 , 35
    
     
  2. Black Hat

    Black Hat Постоялец

    Регистр.:
    15 май 2015
    Сообщения:
    114
    Симпатии:
    76
    На вскидку сделать один индекс на `date`, `allow_main`, `approve`.
    Выполни "EXPLAIN EXTENDED твой запрос" и напиши что выводит.
    UPD. Из оптимизации - date < '2015-07-30 00:00:00' - т.е. не учитывать время. Так кеш запросов будет дольше хранить. С другой стороны, это потеря точности, и 2) если таких запросов куча, ничего не получим, так как новые будут выбивать старые.
     
    Последнее редактирование: 30 июл 2015
  3. lisfox

    lisfox Создатель

    Регистр.:
    22 авг 2012
    Сообщения:
    10
    Симпатии:
    2
    Можно после создания индексов поиграться с параметрами кэша в my.cnf в сторону увеличения, если память позволяет:

    Код:
    key_buffer_size = 16M
    max_allowed_packet = 16M
    table_open_cache = 1024
    table_cache = 1024
    sort_buffer_size = 16M
    #read_buffer_size = 256K
    #read_rnd_buffer_size = 256K
    #net_buffer_length = 4K
    thread_stack = 256K
    query_cache_size=16M
    query_cache_limit=2M
    record_buffer = 16M
    thread_cache_size = 16
    max_sort_length=20
    tmp_table_size = 256M
    max_heap_table_size = 256M
    open_files_limit = 2048