关于mysql innodb count(*)速度慢的解决办法
2012-12-16 00:00
615 查看
innodb引擎在统计方面和myisam是不同的,Myisam内置了一个计数器,所以在使用 select count(*) from table 的时候,直接可以从计数器中取出数据。而innodb必须全表扫描一次方能得到总的数量。要初步解决这个问题,需要做不同于myisam的一些工作:
1、使用第二索引(一般不使用主键索引),并且添加where条件,如:
2、如果只需要粗略统计的话也可使用
show status from product; 来得到大约值
这种方法可在数据分页中使用!
3、使用外部计数器,比如建立一个触发器来计数或者在程序上使用缓存方式定时计数,缺陷是这些方法会额外消耗一些资源!
参考资料:
mysql高性能:http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/
mysql DBA:http://imysql.cn/2008_06_24_speedup_innodb_count
COUNT(*) for Innodb Tables
I guess note number one about MyISAM to Innodb migration is warning what Innodb is very slow in COUNT(*) queries. The part which I often however see omitted is fact it only applies to COUNT(*) queries without WHERE clause.
So if you have query like SELECT COUNT(*) FROM USER It will be much faster for MyISAM (MEMORY and some others) tables because they would simply read number of rows in the table from stored value. Innodb will however need to perform full table scan or full index scan because it does not have such counter, it also can't be solved by simple singe counter for Innodb tables as different transactions may see different number of rows in the table.
If you have query like SELECT COUNT(*) FROM IMAGE WHERE USER_ID=5 this query will be executed same way both for MyISAM and Innodb tables by performing index rage scan. This can be faster or slower both for MyISAM and Innodb depending on various conditions.
In real applications there are much more queries of second type rather than first type so it is typically not as bad problem as it may look. Most typically count of rows is needed by admin tools which may show it in table statistics, it may also be used in application stats to show something like “We have 123.345 users which have uploaded 1.344.656 images” but these are normally easy to remove.
So remember Innodb is not slow for ALL COUNT(*) queries but only for very specific case of COUNT(*) query without WHERE clause. It does not mean I would not like to see it fixed though, it is pretty annoying.
转自:http://www.sphinxsearch.org/archives/89
1、使用第二索引(一般不使用主键索引),并且添加where条件,如:
select count(*) from product where comp_id>=0 ; show index from product ; id primary key comp_id index
2、如果只需要粗略统计的话也可使用
show status from product; 来得到大约值
这种方法可在数据分页中使用!
3、使用外部计数器,比如建立一个触发器来计数或者在程序上使用缓存方式定时计数,缺陷是这些方法会额外消耗一些资源!
参考资料:
mysql高性能:http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/
mysql DBA:http://imysql.cn/2008_06_24_speedup_innodb_count
COUNT(*) for Innodb Tables
I guess note number one about MyISAM to Innodb migration is warning what Innodb is very slow in COUNT(*) queries. The part which I often however see omitted is fact it only applies to COUNT(*) queries without WHERE clause.
So if you have query like SELECT COUNT(*) FROM USER It will be much faster for MyISAM (MEMORY and some others) tables because they would simply read number of rows in the table from stored value. Innodb will however need to perform full table scan or full index scan because it does not have such counter, it also can't be solved by simple singe counter for Innodb tables as different transactions may see different number of rows in the table.
If you have query like SELECT COUNT(*) FROM IMAGE WHERE USER_ID=5 this query will be executed same way both for MyISAM and Innodb tables by performing index rage scan. This can be faster or slower both for MyISAM and Innodb depending on various conditions.
In real applications there are much more queries of second type rather than first type so it is typically not as bad problem as it may look. Most typically count of rows is needed by admin tools which may show it in table statistics, it may also be used in application stats to show something like “We have 123.345 users which have uploaded 1.344.656 images” but these are normally easy to remove.
So remember Innodb is not slow for ALL COUNT(*) queries but only for very specific case of COUNT(*) query without WHERE clause. It does not mean I would not like to see it fixed though, it is pretty annoying.
转自:http://www.sphinxsearch.org/archives/89
相关文章推荐
- 关于mysql innodb count(*)速度慢的解决办法
- 关于mysql innodb count(*)速度慢的解决办法
- 关于mysql innodb count(*)速度慢的解决办法
- mysql innodb count(*)速度慢且不准确的解决办法
- 关于linux下使用phpmyadmin给mysql表关联外键的问题和解决办法
- 关于安装Nginx Apache Php Mysql 的解决办法
- 关于mysql8.0.11版本出现数据库连不上JEESNS问题解决办法
- 909422229_关于Linux下运行mysql命令提示command not found解决办法
- 【MySQL】关于MySQL添加索引后提升的查询效率也很少的解决办法
- 关于Mysql com.mysql.jdbc.StatementImpl$CancelTask内存泄漏问题及解决办法
- 关于mysql中sql语句查询不区分大小写的解决办法
- 查看MySQL是否支持InnoDB引擎以及不支持的解决办法
- 关于No suitable driver found for com.mysql.jdbc.Driver问题的解决办法
- 关于eclipse中ClassNotFoundException:com.mysql.jdbc.Driver的解决办法
- 关于php5.3 操作MySQL响应时间长得解决办法
- 关于asp.net程序第一次运行速度慢的问题解决办法
- 查看MySQL是否支持InnoDB引擎以及不支持的解决办法
- 将MySQL从MyISAM转换成InnoDB错误和解决办法
- MYSQL关于 NO DATABACE SELECT 报错的解决办法
- 关于php集成环境mysql wamp 修改密码后phpMyAdmin拒绝访问解决办法