mysql中的计数查询优化
用户表中总共有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中添加更多列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
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 ...