我有一个表,其中包含两个32位整数。这两个整数用于创建聚簇索引。用于创建表的SQL如下,
CREATE TABLE `a` (
`var1` int(10) unsigned NOT NULL,
`var2` int(10) unsigned NOT NULL,
PRIMARY KEY (`var2`,`var1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
Run Code Online (Sandbox Code Playgroud)
SELECT COUNT(*) FROM a)SHOW TABLE STATUS)根据我的计算,每一行使用51.8个字节。我知道InnoDB在存储行时会产生开销。但是,使用MySQL网站,我计算出行大小应为26个字节(5个字节的标头,8个字节的整数,6个字节的事务ID和7个字节的滚动指针字段)。
我试图减小行的大小,因为该表可能会填充多达1600亿条记录。
我的计算中缺少什么?如何优化表以使用更少的空间?还是应该切换到其他数据库引擎?
更新资料
我对此表的查询;
INSERT INTO a(var1,var2) VALUES(INTEGER,INTEGER),(INTEGER,INTEGER),...,(INTEGER,INTEGER);
SELECT var1 FROM a WHERE var2=INTEGER;
DELETE FROM a WHERE var2=INTEGER;
Run Code Online (Sandbox Code Playgroud) 假设您以特定方式设计App Engine模型类,将代码投入生产并允许用户与您的应用程序进行一段时间的交互,从而将数据生成到App Engine数据存储区中.
现在,假设您决定对其中一个Model类进行更改.
是否有建议的过程来执行此操作 - 在我的情况下是在Java应用程序中 - 以便在新代码投入生产时,它不会导致应用程序在针对具有旧模式的预先存在的数据运行时中断?
例如,在将任何新代码上传到生产环境之前,是否应下载生产数据并对其进行测试?
这类问题的最佳做法是什么?
如果我在创建索引后重命名SQLite Tables/Columns/Rows,旧索引是否仍然可用?
谢谢!
我有4个新的数据输入用户使用特定的GUI来创建/更新/删除主数据库中的条目."GUI"客户端允许他们在地图上查看数据库记录并在那里进行修改,这是很好的首选方式.
但是最近很多人一直在使用PGAdmin直接访问本地数据库并运行批量查询(即更新,插入,删除等),这会引入很多问题,例如人们在设置值时不知道或犯错误更新大量记录.它还会影响我们的记录程序,因为我们正在计算报告目的的平均值和时间戳,这对我们来说非常重要.
那么有没有办法阻止用户使用PGAdmin(请记住很多这些人在家工作,我们无法访问他们的机器)并直接在数据库中运行SQL查询.
我们仍然必须让他们访问某些表,并允许他们执行sql,只要它来自某个客户端,但在他/她尝试直接在db中执行查询时拒绝访问同一用户.
给出如下表:
id key val
---- ---- -----
bob hair red
bob eyes green
Run Code Online (Sandbox Code Playgroud)
还有另一张表:
id key val
---- ---- -----
fred hair red
fred eyes green
fred shoe 42
joe hair red
joe eyes green
greg eyes blue
greg hair brown
Run Code Online (Sandbox Code Playgroud)
我想在表b中找到与表中的人完全匹配的人,在这种情况下Bob和Joe.弗雷德不算数,因为他也有鞋码.这是在Sybase中,因此没有完全外连接.我想出了一个带有联盟的选择,这个联盟可以归还那些肯定不一样的人,但我不确定如何有效地选择那些人.
或者,如果它更简单,我如何检查b中的哪些组不止一次?
简而言之,酿酒商的CAP定理指出任何数据库都是CA,CP或AP
为什么人们将Redis视为CP数据库?
在我的程序中,我在池中有几个线程,每个线程都尝试写入数据库.创建的线程数是动态的.当创建的线程数只有一个时,一切正常.但是,当有多线程执行时,我收到错误:
org.apache.ddlutils.DatabaseOperationException: org.postgresql.util.PSQLException: Cannot commit when autoCommit is enabled.
我猜,也许因为每个线程并行执行,两个线程正在尝试同时写入并给出此错误.
您是否认为是这种情况,如果不是,可能导致此错误的原因是什么?
否则,如果我说的是问题,我可以做些什么来解决它?
我正在尝试使用插入值ContentValues,我已经将5个值插入到5列中.在运行应用程序之后,我只使用了最后一组值的行ContentValues.未插入前四组.
ContentValues cv = new ContentValues();
cv.put("name", "Cs Tech");
cv.put("name", "Wipro");
cv.put("name", "TCS");
cv.put("name", "Infosys");
cv.put("name", "Cognizant");
cv.put("mail", "joe@info.com");
cv.put("mail", "bru@wipro.com");
cv.put("mail", "jen@tcs.com");
cv.put("mail", "ram@infosys.com");
cv.put("mail", "cts@cts.com");
cv.put("contact", "180 151 2010");
cv.put("contact", "180 151 2011");
cv.put("contact", "180 151 2012");
cv.put("contact", "180 151 2013");
cv.put("contact", "180 151 2014");
cv.put("date", "27 Jul 2011");
cv.put("date", "27 Jul 2011");
cv.put("date", "27 Jul 2011");
cv.put("date", "27 Jul 2011");
cv.put("date", "27 Jul 2011");
this.db.insert(TABLE_NAME, "name", cv);
Run Code Online (Sandbox Code Playgroud) 无法在Oracle PIVOT子句中使用用户定义的聚合函数.
我创建了一个名为string_agg的用户定义聚合函数.
我可以在一个简单的声明中使用它,例如......
select id, string_agg(value) from
(
select 'user1' as id, 'BMW' as value, 'CAR' as type from dual union
select 'user1' as id, 'Audi' as value, 'CAR' as type from dual union
select 'user2' as id, 'Honda' as value, 'CAR' as type from dual union
select 'user1' as id, 'Dell' as value, 'COMPUTER' as type from dual union
select 'user1' as id, 'Sony' as value, 'COMPUTER' as type from dual union
select 'user2' as id, 'HP' as …Run Code Online (Sandbox Code Playgroud) 我在测试数据库调用时多次完成的是设置数据库,打开事务并在最后回滚它.我甚至使用了我在每次测试中创建和销毁的内存中的sqlite数据库.这工作并且相对较快.
我的问题是:我应该模拟数据库调用,我应该使用上面的技术还是应该同时使用两者 - 一个用于单元测试,一个用于集成测试(至少对我而言,似乎是双重工作).
database ×10
java ×2
postgresql ×2
sql ×2
sqlite ×2
aggregate ×1
android ×1
format ×1
innodb ×1
mocking ×1
mysql ×1
oracle ×1
pivot ×1
redis ×1
sybase-ase ×1
t-sql ×1
testing ×1
unit-testing ×1
user-defined ×1