mysql中的计数查询优化

mysql中的计数查询优化,mysql,performance,Mysql,Performance,用户表中总共有1629664条记录 如果我从用户那里使用SELECT countu.id,它将在0.00053秒内返回结果,这很好 如果我要使用SELECT countu.id从用户u内部加入用户p在p.user_id=u.id和p.is_delete=0上加入,它将在5.67秒或更长时间内返回结果,这对我不好,我们如何优化此结果 另外,如果我在where with query中添加更多列 SELECT count(u.id) FROM `users` `u` INNER J

用户表中总共有1629664条记录

如果我从用户那里使用SELECT countu.id,它将在0.00053秒内返回结果,这很好

如果我要使用SELECT countu.id从用户u内部加入用户p在p.user_id=u.id和p.is_delete=0上加入,它将在5.67秒或更长时间内返回结果,这对我不好,我们如何优化此结果

另外,如果我在where with query中添加更多列

SELECT  count(u.id)
    FROM  `users` `u`
    INNER JOIN  `user_profile` `p`  ON `p`.`user_id` = `u`.`id`
      and  `p`.`is_delete` = 0
    WHERE  `u`.`gender` in (1,0)
      AND  `u`.`status` = 1
      AND  `u`.`is_delete` =0
      AND  `u`.`user_role` = 2
      AND  `u`.`id` <> 5720962
      AND  `u`.`search_n_dashboard` = 'visible' 
它将在12.45秒或更长时间内返回结果,我需要优化此结果

我用过索引 创建索引用户\u用户id上的索引; 在用户配置文件用户id上创建索引用户配置文件索引; 请建议我,如何使用更多优化

提前感谢

大概u.id是唯一的。因此,您可以将查询简化为:

SELECT count(*)
FROM user_profile p 
WHERE p.is_delete = 0;

此查询可以利用用户档案中的索引进行删除。

查看您的情况以及可以使用复合索引的位置

  On table  users   ( gender , id , status, is_delete , user_role ,id , search_n_dashboard)

基于这些索引,您可以尝试反转表格,更改lead表格 同时也要避免在subselect上使用INNER子句

SELECT count(u.id) 
FROM `user_profile` `p`
INNER JOIN  `users` `u`  ON `p`.`user_id` = `u`.`id` and `p`.`is_delete` = 0 
INNER JOIN ( select 1  as gender union select 2  ) T on T.gender = u.gender
WHERE `u`.`status` = 1 
      AND `u`.`is_delete` =0 
        AND `u`.`user_role` = 2 
          AND `u`.`id` <> 5720962 
            AND `u`.`search_n_dashboard` = 'visible'
您还可以使用强制索引进行连接

SELECT count(u.id) 
FROM `user_profile` `p`
INNER JOIN  `users` `u` FORCE INDEX FOR JOIN (`your_index_for_join`)  ON `p`.`user_id` = `u`.`id` and `p`.`is_delete` = 0 
INNER JOIN ( select 1  as gender union select 2  ) T on T.gender = u.gender
WHERE `u`.`status` = 1 
      AND `u`.`is_delete` =0 
        AND `u`.`user_role` = 2 
          AND `u`.`id` <> 5720962 
            AND `u`.`search_n_dashboard` = 'visible'
有以下索引:

u:  (status, is_delete, user_role, search_n_dashboard, gender)  -- `gender` last
p:  (user_id, is_delete)  -- in either order
不要说COUNTx,除非你需要检查x是否为空;简单地说COUNT*

0.00053s是假的-您已打开查询缓存。再次计时查询,因此:

SELECT SQL_NO_CACHE ...
避免质量控制

为便于读者理解,请使用ON来说明表之间的关系,而不是用于筛选。即将p.is_delete=0移动到WHERE子句

“状态”和“是否删除”不能滚动到单个列中

你有多少性别?如果你只有2个,那就放弃这个测试;您所拥有的使优化变得困难


有关编写索引的详细信息:

谢谢您的回复,但我还想检查用户表中的一些条件。@Kamlesh。您的问题是关于优化您提供的查询的性能。如果你真的有另一个问题,那么再问另一个问题。谢谢你回复我们,但这不是我的解决方案。除了用户表外,我无法执行此操作。我是否需要从上面的表中删除以前的索引?如果使用或不使用新索引,您应该签入解释计划。。如果不是的话,你应该删除索引,可能只有用户_profiles上的索引是的,我已经检查了这两个索引。通过使用这两个索引,结果将在13秒或更长时间内返回。删除用户配置文件表的索引后,结果返回8秒。但它仍然不快。我们怎样才能更优化这个呢?我已经发布了另一个建议。。希望是有用的。。请确保您也有快速磁盘和足够的内存谢谢您的回复,我会检查它并尽快通知您。
SELECT SQL_NO_CACHE ...