请看这张表:
mysql> desc s_p;
+-------------------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| s_pid | int(10) unsigned | YES | MUL | NULL | |
| sm_id | int(10) unsigned | YES | MUL | NULL | |
| m_id | int(10) unsigned | YES | | NULL | |
| created | datetime | YES | | NULL …Run Code Online (Sandbox Code Playgroud) 我有一个带有两个表的 sqlite 数据库,每个表有 50,000 行,包含(假)人的名字。我构建了一个简单的查询来找出有多少个名字(名字、中间名首字母、姓氏)是两个表共有的:
select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial;
Run Code Online (Sandbox Code Playgroud)
当除了主键上没有索引(与此查询无关)时,它运行得很快:
[james@marlon Downloads] $ time sqlite3 generic_data_no_indexes.sqlite "select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial;"
131
real 0m0.115s
user 0m0.111s
sys 0m0.004s
Run Code Online (Sandbox Code Playgroud)
但是如果我为每个表的三列添加索引(总共六个索引):
CREATE INDEX `idx_uk_givenname` ON `fakenames_uk` (`givenname` )
//etc.
Run Code Online (Sandbox Code Playgroud)
然后它运行得很慢:
[james@marlon Downloads] $ time sqlite3 generic_data.sqlite "select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial;"
131
real 1m43.102s
user 0m52.397s
sys …Run Code Online (Sandbox Code Playgroud) 为什么PostgreSQL会顺序扫描表进行COUNT(*)查询,而有一个非常小的索引主键?
我用查询来计算记录
SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%something%'
SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%another%'
SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%word%'
Run Code Online (Sandbox Code Playgroud)
对于每一个计数,mysql都需要遍历整个表,如果表很长,查询很多,这是一个大问题。
我想知道是否有一种方法可以在一个查询中进行所有计数。在这种情况下,当mysql遍历每一行时,它会处理所有计数,而无需一遍又一遍地扫描整个表。
系统视图sys.partitions有一列“行”,它是给定分区中的总行数。对于未分区的表(或只有一个分区,取决于您如何看待它),此列给出了表中的行数。
我很好奇这个列有多准确,我是否可以用它代替SELECT COUNT(1) FROM TableName. 我做了一些实验,创建一个表并添加几千行,删除几百行,再添加几千行等等,而且计数一直都在。但是,我有一张包含大约 7 亿行和几个索引的表。sys.partitions聚集索引的行再次失效,但是其他索引显示出一些细微的变化 (+-20k)。
有谁知道这一行是如何计算的,以及它是否像看起来一样准确?
sql-server sql-server-2008-r2 partitioning count sql-server-2012
我想捕捉 X 行,因此,我设置了LIMIT X; 但是我怎样才能同时计算总行数呢?
目前,我使用两个单独的查询来这样做
SELECT COUNT(*) FROM col WHERE CLAUSE
SELECT * FROM col WHERE CLAUSE LIMIT X
Run Code Online (Sandbox Code Playgroud)
有没有办法在一个查询中做到这一点?
编辑:输出应该是col单元格和行数。实际上,选择col单元格后,它应该只走表格以进行计数。
我知道不可能合并这两个查询,因为第一个返回 1 行,但第二个返回 X 行。我很好奇 mysql 中是否有一个函数可以在LIMIT.
我在文档中看到了count(*)和之间的区别count(pk)。我一直在使用count(pk)(哪里pk是SERIAL PRIMARY KEY)不知道count(*).
我的问题是关于 Postgres 的内部优化。是否足够聪明地发现 aSERIAL PRIMARY KEY将存在于每一行中并且永远不会为假并且只计算行数,或者它是否会对每一行进行冗余谓词检查?我同意这可能是一个毫无意义的优化,但我只是好奇。
我看了看输出EXPLAIN和EXPLAIN VERBOSE为count(*),count(id)并count(id > 50)看看是否EXPLAIN提到检查其输出的断言。它没有。
如何在 MySQL 的同一列上计数和检索 null 和 not null?
---------------------------------------------------
id | name | visited | registDate |
---------------------------------------------------
1 | george | NULL | 2014-04-01 |
---------------------------------------------------
2 | Thomas | NULL | 2014-04-15 |
---------------------------------------------------
3 | Wilfred | 1 | 2014-04-24 |
---------------------------------------------------
4 | paul | 1 | 2014-04-10 |
---------------------------------------------------
5 | elina | NULL | 2014-05-03 |
---------------------------------------------------
6 | angela | NULL | 2014-04-13 |
---------------------------------------------------
7 | elina | 1 | 2014-05-18 | …Run Code Online (Sandbox Code Playgroud) 下面是我的会员表的一个例子。在电子邮件字段中有一些记录具有多个值。我只想选择那些具有多个电子邮件值的记录:
ID LASTNAME FIRSTNAME EMAIL
567 Jones Carol carolj@gmail.com
567 Jones Carol caroljones@aol.com
678 Black Ted tedblack@gmail.com
908 Roberts Cole coleroberts@gmail.com
908 Roberts Cole coler@aol.com
908 Roberts Cole colerobersc@hotmail.com
Run Code Online (Sandbox Code Playgroud)
我希望结果是:
567 Jones Carol carolj@gmail.com
567 Jones Carol caroljones@aol.com
908 Roberts Cole coleroberts@gmail.com
908 Roberts Cole coler@aol.com
908 Roberts Cole colerobersc@hotmail.com
Run Code Online (Sandbox Code Playgroud)
请注意,缺少 Ted Black,因为他只有一个电子邮件地址条目。
我应该澄清一下,我的会员表有 4 列以上。电话和地址等还有额外的列。一个成员可能有多个条目,因为他/她有多个电话号码或地址。我只想捕获那些拥有多个电子邮件地址的人。
这是数据库清理的一部分,将添加主键。我应该进一步澄清,有些人可能有多个具有相同电子邮件地址的条目。在此阶段,我不想捕获具有相同电子邮件地址的多个条目,而只想捕获具有不同电子邮件地址的多个条目的那些条目。
我有一个包含两列的表,我想计算 Col_B 上(由)Col_A 上的不同值。
我的表
Col_A | Col_B
A | 1
A | 1
A | 2
A | 2
A | 2
A | 3
b | 4
b | 4
b | 5
Run Code Online (Sandbox Code Playgroud)
预期结果
Col_A | Col_B | Result
A | 1 | 3
A | 1 | 3
A | 2 | 3
A | 2 | 3
A | 2 | 3
A | 3 | 3
b | 4 | 2
b | 4 | …Run Code Online (Sandbox Code Playgroud) count ×10
mysql ×4
index ×2
optimization ×2
performance ×2
postgresql ×2
select ×2
sql-server ×2
distinct ×1
mysql-5.5 ×1
null ×1
partitioning ×1
query ×1
sqlite ×1