2016-03-20 24 views
4

KARŞI MAÇ yavaşlatır Aşağıdaki MySQL sorgusu vardır:MySQL: ORDER BY arama

$sql = "SELECT (SELECT COUNT(share_id) FROM pd_shares WHERE section = 'news' AND item_id = news.article_id) AS count_shares, article_id, link, title, publish_date, description, source FROM pd_news AS news WHERE (MATCH (title_ascii, description_ascii) AGAINST ('".match_against($_GET["sn"])."' IN BOOLEAN MODE)) AND article_id > " . $last_index . " ORDER BY article_id ASC LIMIT 0,$limit"; 

Bir arama yaptığınızda, sorgu yükleri ORDER BY deyimi ile 513,24 ms. Ben kaldırdığımda, 77.12 ms çalışır. Her iki title_ascii ve description_ascii, FULLTEXT'dir.

Bu Sorguyu yeniden yazabilirim, böylece çalışma hızı şu an olduğundan daha hızlı yüklenir?

EXPLAIN çıkışı:

id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 PRIMARY  news fulltext PRIMARY,news_search  news_search  0 NULL 1 Using where; Using filesort 
2 DEPENDENT SUBQUERY pd_shares ref  section  section  19 const,my_database.news.article_id 2 Using index condition 
+2

EXPLAIN çıktınızı gönderebilir misiniz? –

+0

EXPLAIN Yayınlandı. –

+0

EXPLAIN çıkışınız, sorgunun oldukça hızlı olması gerektiğini, çünkü yalnızca birkaç satır işlediğini anlattı. EXPLAIN'i gerçek veri kümesinde mi ararsınız? –

cevap

0

O başvurulan tablolar (pd_shares ve pd_news) için şemayı bilmek yararlı olacaktır. Alt seçimi normal bir birleştirmeye taşıdım ve şu şekilde bir grup ekledim:

$sql = "SELECT 
      article_id 
     , link 
     , title 
     , publish_date 
     , description 
     , source 
     , COUNT(shares.share_id) AS count_shares 
     FROM pd_news AS news 
     LEFT JOIN pd_shares shares 
      ON shares.section = 'news' AND shares.item_id = news.article_id 
     WHERE (MATCH (title_ascii, description_ascii) AGAINST ('".match_against($_GET["sn"])."' IN BOOLEAN MODE)) 
      AND article_id > " . $last_index . " 
     GROUP BY article_id 
     ORDER BY article_id ASC LIMIT 0, $limit";