mysql innodb count(*)速度慢且不准确的解决办法

innodb引擎在统计方面和myisam是不同的,Myisam内置了一个计数器,所以在使用 select count(*) from table 的时候,直接可以从计数器中取出数据。而innodb必须全表扫描一次方能得到总的数量。要初步解决这个问题,需要做不同于myisam的一些工作:

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采用InnoDB时,count表的记录数随时都会发生变化,特别是在delete和insert比较频繁的时候,这个问题以前注 意过,但由于很长时间没关注,忘了,今天特别在服务器上测试了一下,每次count时都会出现一个很离谱的统计数(select count(*) from user)

解决方法有一下几种,欢迎补充:
1、通过统计全表记录数时在where后面加一个有索引的字段作为条件来查询全表数据,如:select count(tid) from posts where tid>0;  tid不为主键,tid有索引

2、采用InnoDB的表插入数据,不删除,删除数据通过一个字段来标识,isDel=1表示删除0表示正常,这样select count(*) from posts 的数据相对准确一些

3、通过计数器来记录表的数据总行数,添加是增1,删除时减1;这样获取表记录数是最快的,而且是最复杂的

时间: 2024-10-09 13:07:45

mysql innodb count(*)速度慢且不准确的解决办法的相关文章

优化导入数据到MariaDB、Mysql(InnoDB)的速度

关键配置:关闭binlog 环境:8G的sql文件,300多个InnoDB数据表,(用MysqlWorkbench导出的数据,用HeidiSql导入,因为正式环境是mysql,可以用MysqlWorkbench,而MariaDB用不了导出,要用HeidiSql,直接用mysqldump.source命令也可以).导出耗时6分钟,导入耗时55分钟(有待提高,跟进中) 版本:MariaDB 10 1.注释"log-bin=mysql-bin"."binlog_format=mix

MySQL数据库like查询中文出现不准确的解决方法

2013-02-18 1,502阅 评论( 暂无评论 ) 更多0 Mysql数据库like查询中文出现不准确的解决方法,中文检索有时候有点蛋疼,Mysql数据库like查询中文有时候会出现不准确.而且,在进行like检索时,有时候会返回一些与查询词不相关的记录,如查找 “%s%” 时,返回的结果中可能有中文字符,却没有s字符存在,这与数据库中文编码规则有关. 如希望查找title中含有字母s的所有新闻: select * from test.news where title like '%s%'

MYSQL更改root password时遇到Access Denied的解决办法

今天在公司虚拟机上装MYSQL之后需要修改root password,然而遇到这样的错误: Access denied for user 'root'@'localhost' (using password:YES) 后来在网上搜了下,找到如下解决办法,测试可用. # /etc/init.d/mysql stop# mysqld_safe --user=mysql --skip-grant-tables --skip-networking &# mysql -u root mysqlmysql&g

Navicat 连接MySQL数据库 报错2059 - authentication plugin 'caching_sha2_password'的解决办法

#在数据库的命令行中输入以下代码即可解决,密码必须要修改 可以再次执行将密码改回来. use mysql; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; Navicat 连接MySQL数据库 报错2059 - authentication plugin 'caching_sha2_password'的解决办法 原文地址:https://www.cnblogs.com/liuha

MySQL 数据库输入密码后闪退的问题及解决办法

MySQL 数据库输入密码后闪退的问题及解决办法 1.问题说明 在启动MySQL服务端并输入密后,出现闪退现象.实际上,这种问题很常见,大多数原因可能是在咱们使用安全软件的时候,无意中关闭了MySQL服务.此外,如果MySQL服务已经启动了,但还是出现了闪退的现象,那就可能是MySQL的配置出现了问题. 2.解决方案(步骤) 鼠标右击此电脑 点击管理 点击服务和应用程序 点击服务 找到MySQL,点击启动此服务即可 原文地址:https://www.cnblogs.com/zhuchengbo/

mysql like 匹配查询出不正确中文的解决办法

本文讲述mysql使用like语句时,匹配查询出不正确中文的解决办法 mysql like 搜索的时候发现,用 select title from tb_name where title like '%a%' 的时候出来的结果除了包含a的名字外连包含中文“新”的名字也出现在搜索结果里面,这令我想弄清楚mysql的匹配模式和规则到底是怎么样的,另外在匹配的时候正则表达式也很常用! 出现这个问题的原因是:MySQL在查询字符串时是大小写不敏感的,在编绎MySQL时一般以ISO-8859字符集作为默认

mysql中RAND()随便查询记录效率问题和解决办法分享

在我们做开发的中效率一直是个问题,特别是对于很多大数据量操作,今天我们碰到一个要随机查询数据,一开始我们可能想到最简单的order by rand() 来操作但效率不敢恭维啊 最近由于需要大概研究了一下MYSQL的随机抽取实现方法.举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1. 有两个方法可以达成以上效果. 1.新建一个表,里面存着 -5 至 5 之间的数.再利用order

Linux环境下启动MySQL数据库出现找不到mysqld.sock的解决办法!

问题: 在普通用户权限下运行:mysql -u root -p,回车之后如果会出现如下错误:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) 此错误的意思就是没有找到mysqld.sock文件. 解决办法: 首先进入超级用户root权限  sudo -i 或者su - root 切换到默认目录 cd /var/lib/mysql  下查看

【linux】CentOS安装mysql*.rpm提示conflicts with file from package的解决办法

使用以下命令安装: rpm -ivh MySQL-server-5.6.19-1.linux_glibc2.5.x86_64.rpm 错误提示如下: Preparing...                ########################################### [100%] file /usr/share/mysql/charsets/README from install of MySQL-server-5.6.19-1.linux_glibc2.5.x86_6