使用索引计算MYSQL上的查询优化

时间:2014-02-20 07:06:32

标签: mysql sql performance optimization

我有这个查询

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 

所以这似乎利用了索引,但我仍然得到超时错误。我怎样才能进一步优化?

2 个答案:

答案 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;