Оптимизировать MySQL Query, перенастроить MY.CNF? - PullRequest
0 голосов
/ 09 октября 2011

Может ли кто-нибудь помочь мне оптимизировать этот запрос и настроить мой файл my.cnf?

SELECT 
  rf_row_id, 
  pf_id,
  pf_wordpress_url, 
  pf_merchant_logo, 
  rf_desc, 
  rf_manufacturer, 
  rf_product_name, 
  rf_small_image, 
  rf_price,
  pf_name,
  rf_shipping_handling_cost, 
  pf_voucher_code_expiry_date,
  pf_voucher_code,
  pf_voucher_code_instructions,
  rf_last_modified,
  pf_last_update,
  rf_deep_link,
  pf_delivery_free_from,
  pf_voucher_code_url,
  pf_delivery_string,
  pf_delivery_fee_2 
FROM raw_feed, product_feeds 
WHERE pf_id=rf_feed_id 
AND ( rf_search_index LIKE '%C4838AE%' OR rf_search_index LIKE '%HP11%')
GROUP BY rf_feed_id, rf_product_id ORDER BY rf_price ASC

Выполнение занимает около 5 секунд после перезапуска сервера, и запрос не находится в chache. У меня есть индексы на: таблица product_feeds в столбце pf_id (основной) таблица raw_feed в rf_row_id (основной) и столбец rf_search_index

После ОБЪЯСНЕНИЯ я получаю:

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: raw_feed
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 263804
        Extra: Using where; Using temporary; Using filesort
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: product_feeds
         type: eq_ref
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 2
          ref: usrdb_rnbx.raw_feed.rf_feed_id
         rows: 1
        Extra:

Не знаю, почему ключ для первого ряда равен нулю ?! Какие индексы я должен создать?

У меня всего 263 804 строки в таблице raw_feed и 50 строк в таблице product_feeds.

Файл MY.CNF: ()

[mysqld]
basedir=/opt/bitnami/mysql
character-set-server=UTF8
collation-server=utf8_general_ci
datadir=/opt/bitnami/mysql/data
port=3306
socket=/opt/bitnami/mysql/tmp/mysql.sock
tmpdir=/opt/bitnami/mysql/tmp
set-variable = max_connections=3096
set-variable = max_allowed_packet=15M
key_buffer = 1024M
key_buffer_size = 1024M
table_cache = 1024
sort_buffer_size = 50M
read_buffer_size = 50M
read_rnd_buffer_size = 16M
myisam_sort_buffer_size = 3M
thread_cache = 32
thread_concurrency = 16
open-files-limit= 261424
set-variable = thread_stack=512k
set-variable = query_cache_size=128M
set-variable = wait_timeout=120
set-variable = interactive_timeout=60
set-variable = max_connect_errors=999999 

Может кто-нибудь помочь мне перенастроить этот файл и помочь мне с запросом?

Я использую небольшой экземпляр amazon aws ec2 с корневым хранилищем 10 ГБ, 1,7 ГБ (ОЗУ?)

Спасибо

Ответы [ 2 ]

2 голосов
/ 09 октября 2011

LIKE с процентом в начале не может использовать индекс в MySQL.Это связано с тем, что MySQL должен знать start строки, чтобы найти ее в своем индексе (это ограничение того, как MySQL работает с индексами, и фактически с большинством продуктов баз данных).Итак, лучшее, что может сделать MySQL, - это сканировать raw_feed, что и делает.

Вам нужно найти другой способ сделать этот поиск.Одним из вариантов будет (при условии, что вы используете MyISAM, что, вероятно, прямо из вашего my.cnf) встроенный полнотекстовый поиск.Другой может быть, например, Sphinx .

Кроме того, ваши настройки my.cnf странные (соблазн сказать «безумный»).Ваш key_buffer - это большой способ для системы с 1,7 ГБ ОЗУ.Но настройку MySQL, вероятно, лучше всего задавать на Serverfault.

0 голосов
/ 09 октября 2011

Ваша таблица raw_feed должна иметь индекс rf_feed_id для оптимизации объединения с вашей таблицей product_feeds ... без этого она в основном пытается принудительно заставить индекс на лету соответствовать условию JOIN, не говоря уже о квалификаторе LIKE

...