我有这个查询
SELECT COUNT(*) as user_count, `partner` FROM (`my_table`) WHERE date_join <='2014-02-19 23:59:59' AND isConfirm=1 GROUP BY `partner`
该表已有420000行,此查询已超时。我在查询期间得到错误丢失与mysql服务器的连接。
我已经有date_join的索引,解释结果如下:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE my_table range date_join date_join 9 NULL 112223 Using where; Using temporary; Using filesort
所以这似乎利用了索引,但我仍然得到超时错误。我怎样才能进一步优化?
答案 0 :(得分:0)
您可以尝试在date_join和isConfirm上创建索引。例如:
alter table `my_table` add index `my_index` (`date_join`,`isConfirm`);
答案 1 :(得分:0)
如果您通过以下2获得大约相同的行,则查询apporox。根据你的解释建议112223行,然后按照@RKG的建议创建组合索引没有任何好处,但如果你的行数少得多,那么它就会有所帮助。
SELECT COUNT(*)FROM my_table WHERE date_join&lt; ='2014-02-19 23:59:59';
SELECT COUNT(*)FROM my_table WHERE date_join&lt; ='2014-02-19 23:59:59'and isConfirm = 1;
如果你得到约。两个查询中的相同行然后您可以检查以下事项来处理此问题:
首先检查配置文件/etc/my.cnf
中变量下面的内容tmp_table_size = ???
max_heap_table_size = ???
sort_buffer_size = ???
join_buffer_size = ???
增加这些变量可以获得解决方案,但是您必须检查系统中的总内存以及对您来说足够的值。如果您的值小于这些值,您可以按照以下设置值 -
tmp_table_size = 1G
max_heap_table_size = 1G
sort_buffer_size = 10M
join_buffer_size = 2M
注意:确保您的system / tmp目录的空间也应超过1 GB。
即使你在查询中也应该添加一个较低的日期过滤器,因为你几乎所有的数据都要提取到昨天,然后才能应用分组。
如果您需要完整计数到昨天,那么您可以尝试以下查询。我不确定它是否对你有所帮助,但你可以试试。
SELECT COUNT(primary_key) AS user_count, `partner` FROM (SELECT primary_key, partner FROM my_table WHERE date_join <='2014-02-19 23:59:59' AND isConfirm=1) a GROUP BY partner;