2017-05-25 14 views
0
SELECT user_id,username,full_name,display_name,profile_pic,email, 
     fb_id,image1,image2,image3,image4,image5,default_pic, 
     street_address,locality,country,state,is_verified,is_online, 
     city,image6,image7,image8,image9,image10,last_login, 
     IFNULL((
       SELECT STATUS 
        FROM vidioo_contacts 
        WHERE (contact_id = '55000' 
           AND user_id = vu.user_id 
         ) 
         OR (contact_id = vu.user_id 
           AND user_id = '55000')),0) AS STATUS, 
     (3959 * ACOS(COS(RADIANS(0)) * COS(RADIANS(latitude)) * 
      COS(RADIANS(longitude) - RADIANS(0)) + SIN(RADIANS(0)) * 
      SIN(RADIANS(latitude))) 
      ) AS distance 
    FROM vidioo_users vu 
    WHERE user_id != '55000' 
     AND gender LIKE 
     (SELECT CASE WHEN show_me = 'everyone' 
        THEN '%' 
        ELSE IF(LENGTH(show_me) < 1, '%', show_me) 
        END 
      FROM vidioo_users 
      WHERE user_id = '55000' 
      LIMIT 1 
     ) 
     AND IFNULL(vu.is_deleted,0) != 55000 
     AND vu.user_id NOT IN (
     SELECT DISTINCT contact_id 
      FROM vidioo_blocked_users 
      WHERE bloked_by_user = 55000 
         ) 
     AND DATEDIFF(NOW(),last_login) < 7 
    ORDER BY last_login DESC 
    LIMIT 0,20 

このクエリにインデックスを適用します。適用方法このクエリのインデックスを作成する

+0

まず、デザインを正規化する – Strawberry

答えて

0

これら四つのテーブルの列に索引を追加してみてください、それは助ける必要があります。

contact_id, 
user_id, 
is_deleted, 
last_login. 
1

テーブルが複数列のインデックスを持っている場合、MySQLはインデックスの左端の接頭辞を使用しています。たとえば、次の選択クエリがあります。 -

`SELECT * FROM tbl_name WHERE col1 = val1; SELECT * FROM tbl_name WHERE col1 = val1 AND col2 = val2;

SELECT * FROM tbl_name WHERE col2 = val2; SELECT * FROM tbl_name WHERE col2 = val2 AND col3 = val3;

インデックスが(col1、col2、col3)に存在する場合、最初の2つのクエリのみがインデックスを使用します。 3番目と4番目のクエリにはインデックス付きの列が含まれますが、(col2)と(col2、col3)は(col1、col2、col3)の左端のプレフィックスではありません。あなたのケースでは

あなたはとして3つのインデックスを作成するために必要

  1. INDEX_1(user_idは、性別、last_login)
  2. Index_2(USER_ID)
  3. Index_3(bloked_by_user)

注: -インデックス作成スローダウンINSERTクエリ処理が多すぎます。他の提案に加えて、より詳細Click here

0

については は、あなたが持っているものAND DATEDIFF(NOW(),last_login) < 7

last_login > NOW() - INTERVAL 7 DAY 

にを変更すると、インデックスとそれが使用できなくなり、機能( DATEDIFF)内の列 last_loginを非表示にします。その後、また、(それが助けないかもしれないが、それは。あります)

また、

と一緒

AND NOT EXISTS(SELECT * FROM vidioo_blocked_users 
     WHERE bloked_by_user = 55000 
      AND contact_id = vu.user_id) 

AND vu.user_id NOT IN (
    SELECT DISTINCT contact_id 
     FROM vidioo_blocked_users 
     WHERE bloked_by_user = 55000 
        ) 

を変更

INDEX(last_login) 

を追加

INDEX(bloked_by_user, contact_id) -- in either order 
関連する問題