2011-10-09 8 views
0

quelqu'un peut-il m'aider à optimiser cette requête et m'aider à régler mon fichier my.cnf?Optimiser la requête MySQL, reconfigurer 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 

Il faut environ 5 secondes pour s'exécuter après le redémarrage du serveur et la requête n'est pas en cours. Je des index à: tableau product_feeds à pf_id colonne (primaire) Table raw_feed à rf_row_id (primaire) et rf_search_index colonne

EXPLIQUER Après je reçois:

*************************** 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: 

Je ne sais pas pourquoi la clé pour la première row est nul ?! Quels index dois-je créer?

J'ai 263 804 lignes au total dans la table raw_feed et 50 lignes dans la table product_feeds.

fichier 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 

Quelqu'un peut me aider à reconfigurer ce fichier et me aider à la requête?

-je utiliser amazon aws EC2 petit exemple avec le stockage racine de 10GB, 1.7GB (RAM?) Mémoire

Merci

+0

pourquoi le GROUP BY? –

Répondre

2

LIKE avec un pourcentage au début ne peut pas utiliser un index dans MySQL. C'est parce que MySQL doit connaître le commencer de la chaîne afin de le rechercher dans son index (c'est une limitation de la façon dont MySQL fait des index, et en fait de la plupart des produits de base de données). Donc, le meilleur MySQL peut faire est de numériser raw_feed -qui est ce que ça fait.

Vous devez trouver un autre moyen de faire cette recherche. Une option serait (en supposant que vous utilisez MyISAM, qui est probablement directement à partir de votre my.cnf) de recherche de texte intégré. Un autre serait, par exemple, Sphinx.

De plus, vos paramètres my.cnf sont bizarres (vous pourriez dire «fou»). Votre key_buffer est beaucoup plus grand pour un système avec 1.7G de RAM. Mais le réglage MySQL est probablement mieux demandé sur Serverfault.

0

Votre table raw_feed devrait avoir un index sur rf_feed_id pour optimiser la rejoindre à votre table product_feeds. .. sans cela, c'est essentiellement essayer de forcer un index à la volée pour correspondre à la condition JOIN, sans parler du qualificatif LIKE

+0

Non, il est forcé de faire une analyse de table en raison de 'LIKE '% foo%''. C'est alors en utilisant un index (sur product_feeds) pour faire la jointure ('eq_ref'). – derobert