2017-10-16 6 views
1

J'ai une table avec environ 10k lignes. Je lance ci-dessous sql mais il est trop de temps (~ 4 secondes):La requête Mysql est trop lente lors de la commande par datetime

SELECT 
     ID, post_date, post_title, post_name, pc.post_view, 
     t.name AS post_category, 
     pm2.meta_value AS post_image 
    FROM wp_posts p 
     INNER JOIN wp_term_relationships tr ON p.ID = tr.object_id 
     INNER JOIN wp_term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy='category' 
     INNER JOIN wp_terms t ON tt.term_id = t.term_id AND (t.name='My Posts' OR t.name='HOT posts') 
     LEFT JOIN post_counter pc ON p.ID = pc.post_id 
     LEFT JOIN wp_postmeta pm ON pm.post_id = p.ID AND pm.meta_key = '_thumbnail_id' 
     LEFT JOIN wp_postmeta pm2 ON pm.meta_value = pm2.post_id AND pm2.meta_key = '_wp_attached_file' 
    WHERE p.post_status = 'publish' AND p.post_type = 'post' 
    ORDER BY FIELD(t.name, 'HOT posts', 'My Posts'), post_date DESC 
    LIMIT 14 

Si je retire « commande par POST_DATE », tout va bien. Il ne prend que 0,05 seconde à courir.

J'ai ajouté quelques index avec CREATE INDEX et ADD INDEX (Je ne sais pas quelle est la différence entre eux):

CREATE INDEX ix_type_date ON wp_posts (post_type, post_date) 

ALTER TABLE wp_posts ADD INDEX ix_status_type_date (post_status,post_type,post_date) 

ensuite utiliser ces index avec USE INDEX et INDEX FORCE (je ne sais pas non ce qui est la différence entre eux):

...FROM wp_posts p USE INDEX (ix_type_date)... 

OU

...FROM wp_posts p FORCE INDEX (ix_status_type_date)... 

Je reçois toujours mon Recor ds, mais le temps de chargement est passé à 7-8 secondes.

Vraiment besoin de votre aide! Merci à l'avance!

EDIT:

structure du tableau

ID bigint(20) No   
post_author bigint(20) No 0   
post_date datetime No 0000-00-00 00:00:00   
post_date_gmt datetime No 0000-00-00 00:00:00   
post_content longtext No   
post_title text No   
post_excerpt text No   
post_status varchar(20) No publish   
comment_status varchar(20) No open   
ping_status varchar(20) No open   
post_password varchar(255) No   
post_name varchar(200) No   
to_ping text No   
pinged text No   
post_modified datetime No 0000-00-00 00:00:00   
post_modified_gmt datetime No 0000-00-00 00:00:00   
post_content_filtered longtext No   
post_parent bigint(20) No 0   
guid varchar(255) No   
menu_order int(11) No 0   
post_type varchar(20) No post   
post_mime_type varchar(100) No   
comment_count bigint(20) No 0 
+0

Pouvez-vous afficher la structure de la table ici avec l'index? –

+0

Pouvez-vous essayer de mettre un index composite sur 'wp_terms.name' et' post_date'? –

+0

Fournit des instructions SHOW CREATE TABLE pour TOUTES les tables pertinentes, ainsi que les résultats du fichier EXPLAIN. – Strawberry

Répondre

-2

https://www.sqlservercentral.com/Forums/Topic727934-360-1.aspx

s'il vous plaît se référer à ce lien. Cela vous aidera à résoudre cette requête.

+0

L'OP utilise MySQL, pas SQL Server. Et cela devrait être un commentaire. –

+0

Merci, mais je ne peux pas ouvrir ce lien. Il est encore en chargement après 2 minutes. Pourriez-vous me dire une idée? –

0

Vous voulez d'abord "Hot posts", puis "my posts"? Et il y aura probablement moins de 14 Hotties, et il y a beaucoup de "mes messages"?

Une solution maladroite est de

(SELECT ... name='HOT posts' ORDER BY post_date DESC LIMIT 14) 
UNION ALL 
(SELECT ... name='My Posts' ORDER BY post_date DESC LIMIT 14) 
ORDER BY field(...), post_date DESC LIMIT 14 

Notez qu'il ya une chance de trouver rapidement les dernières 14 de chaque catégorie, puis réorganisant rapidement le 28 pour obtenir le désiré 14.

Pour many à-plusieurs tables, voir here pour savoir comment améliorer leurs performances. (Le WP par défaut est plutôt inefficace.)

Si vous avez besoin de discuter plus en détail, veuillez fournir EXPLAIN SELECT ... et SHOW CREATE TABLE.