Php 如何应用此查询的索引
我希望将索引应用于此查询。尝试在这四个表列上添加索引,这将有助于:Php 如何应用此查询的索引,php,mysql,indexing,Php,Mysql,Indexing,我希望将索引应用于此查询。尝试在这四个表列上添加索引,这将有助于: 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,image
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
如果表有多列索引,那么mysql使用索引最左边的前缀。例如,您有以下选择查询- `从tbl_名称中选择*,其中col1=val1; 从tbl_名称中选择*,其中col1=val1和col2=val2 从tbl_名称中选择*,其中col2=val2; 从tbl_名称中选择*,其中col2=val2和col3=val3` 如果col1、col2、col3上存在索引,则只有前两个查询使用该索引。第三个和第四个查询确实涉及索引列,但是col2和col2,col3不是col1,col2,col3最左边的前缀 在您的情况下,必须创建3个索引作为 索引用户id、性别、上次登录 索引用户id 索引\u 3由\u用户阻塞\u 注意:-索引太多会减慢插入查询处理。
有关更多详细信息,请参见其他建议、change AND DATEDIFFNOW、last_login<7 to 您所拥有的将列last_login隐藏在函数DATEDIFF中,使其无法用于索引。然后,再加上
last_login > NOW() - INTERVAL 7 DAY
这可能没有帮助,但可能会
还有,改变
INDEX(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
)
AND NOT EXISTS( SELECT * FROM vidioo_blocked_users
WHERE bloked_by_user = 55000
AND contact_id = vu.user_id )
INDEX(bloked_by_user, contact_id) -- in either order