当您限制通常在分页中使用的SQL查询返回的行数时,有两种方法可以确定记录总数:
SQL_CALC_FOUND_ROWS在原始文件中包含该选项SELECT,然后通过运行获取总行数SELECT FOUND_ROWS():
SELECT SQL_CALC_FOUND_ROWS * FROM table WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();
Run Code Online (Sandbox Code Playgroud)
正常运行查询,然后通过运行获取总行数 SELECT COUNT(*)
SELECT * FROM table WHERE id > 100 LIMIT 10;
SELECT COUNT(*) FROM table WHERE id > 100;
Run Code Online (Sandbox Code Playgroud)
哪种方法最好/最快?
查询:
SELECT COUNT(online.account_id) cnt from online;
Run Code Online (Sandbox Code Playgroud)
但是在线表也被事件修改,因此我经常可以通过运行看到锁定show processlist.
MySQL中是否有任何语法可以使select语句不引起锁定?
而且我忘了在上面提到它是在MySQL奴隶数据库上.
我加入my.cnf:transaction-isolation = READ-UNCOMMITTED
奴隶后会遇到错误:
错误'无法进行二进制日志记录.消息:InnoDB中的事务级别"READ-UNCOMMITTED"对于查询的binlog模式"STATEMENT"不安全
那么,是否有兼容的方法来做到这一点?
我在我的项目中使用Room持久性数据库.我有一个表,其中有一个布尔值列,如0或1,现在我想要所有布尔值的计数,其值为true(或1).
我知道我可以通过使用where子句获取所有选定行的计数来使用select查询实现此目的!
但我不想使用选择查询与where子句为此,因为它将加载所有行,然后我将得到计数,但我想要计数而不加载任何行!建议其他简单的解决方案!谢谢!
database android boolean-operations booleanquery android-room
mysql> select count(*) from table where relation_title='xxxxxxxxx';
+----------+
| count(*) |
+----------+
| 1291958 |
+----------+
mysql> explain select * from table where relation_title='xxxxxxxxx';
+----+-------------+---------+-
| id | select_type | rows |
+----+-------------+---------+-
| 1 | SIMPLE | 1274785 |
+----+-------------+---------+-
Run Code Online (Sandbox Code Playgroud)
我认为"解析select*from table where relation_title ='xxxxxxxxx';" 通过索引返回relation_title ='xxxxxxxxx'的行.但它比真正的数字要小.
对于InnoDB存储,最好是计算记录总数
使用mysql_num_rows上
select * from tbl where pk = 1
Run Code Online (Sandbox Code Playgroud)或者
获取数组并从中检索"total"值
select count(*) as total from tbl where pk = 1
Run Code Online (Sandbox Code Playgroud)?
我有一个名为"downloads"的表,有两个外键列 - "user_id"和"item_id".我需要从该表中选择所有行,并删除有问题的User或Item不再存在的行.(查找用户,如果找不到,请删除"下载"中的行,然后查找项目,如果找不到,请删除"下载"中的行).
这是340万行,所以我所有的脚本解决方案都需要6个多小时.我希望有一种更快,仅限SQL的方法来做到这一点?
mysql ×4
android ×1
android-room ×1
booleanquery ×1
count ×1
database ×1
explain ×1
locking ×1
optimization ×1
performance ×1
sql ×1