上下文:使用的框架是 Spring,所有查询都使用 JdbcTemplate 运行。Mysql Server 版本为 5.6.19。这table是一个InnoDB table和默认值,并且设置了auto commit隔离级别可重复读取。
问题:Insert一个事务发生在一个事务中select,读取插入的相同数据的一个没有看到数据。在select运行后,在insert之后的insert交易都有commited。
我在 mysql 中启用了 bin 日志和一般日志。相关日志如下
二进制日志:
SET TIMESTAMP=1438265764/*!*/;
BEGIN
/*!*/;
# at 249935389
#150730 14:16:04 server id 1 end_log_pos 249935606 CRC32 0xa6aca292 Query thread_id=40 exec_time=0 error_code=0
SET TIMESTAMP=1438265764/*!*/;
insert into user_geo_loc_latest(user_id, lat, lng) values(x,y,z) on duplicate key update lat=y, lng=z
/*!*/;
# at 249935606
#150730 14:16:06 server id 1 …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我的 INSERT 似乎占用了大部分时间。我在内存中有大量对象(~40-50,000),我想将它们插入到表中。
让我们拿一个样本表
CREATE TABLE bill (
id BIGINT(20) PRIMARY KEY,
amount INT(11) DEFAULT 0,
bill_date DATETIME DEFAULT NOW(),
INDEX (bill_date)
) ENGINE=InnoDB
Run Code Online (Sandbox Code Playgroud)
以 3 行作为我的批量大小,以下是我能想到的插入方法
方法 1 - 构建并触发 3 个原始插入
INSERT INTO bill (amount, bill_date) VALUES (10, '2012-01-01 00:00:00');
INSERT INTO bill (amount, bill_date) VALUES (20, '2012-01-02 00:00:00');
INSERT INTO bill (amount, bill_date) VALUES (40, '2013-02-05 00:00:00');
Run Code Online (Sandbox Code Playgroud)
方法 2 - 将值合并到 1 个查询中
INSERT INTO bill (amount, bill_date) VALUES
(10, '2012-01-01 00:00:00'),
(20, '2012-01-02 00:00:00'),
(40, '2013-02-05 …Run Code Online (Sandbox Code Playgroud) 我有 java 代码将 UTF-8 字符串修剪为我的 Oracle (11.2.0.4.0) 列的大小,最终抛出错误,因为 java 和 Oracle 将字符串视为不同的字节长度。我已经验证我NLS_CHARACTERSET在 Oracle 中的参数是“UTF8”。
我写了一个测试,使用unicode 花栗鼠表情符号(?)
public void test() throws UnsupportedEncodingException, SQLException {
String squirrel = "\uD83D\uDC3F\uFE0F";
int squirrelByteLength = squirrel.getBytes("UTF-8").length; //this is 7
Connection connection = dataSource.getConnection();
connection.prepareStatement("drop table temp").execute();
connection.prepareStatement("create table temp (foo varchar2(" + String.valueOf(squirrelByteLength) + "))").execute();
PreparedStatement statement = connection.prepareStatement("insert into temp (foo) values (?)");
statement.setString(1, squirrel);
statement.executeUpdate();
}
Run Code Online (Sandbox Code Playgroud)
这在测试的最后一行失败,并显示以下消息:
ORA-12899: 列
"MYSCHEMA"."TEMP"."FOO" 的值太大(实际:9,最大值:7)
的设置NLS_LENGTH_SEMANTICS是BYTE。不幸的是,我无法改变它,因为它是一个遗留系统。我对增加列大小不感兴趣,只是能够可靠地预测字符串的 Oracle 大小。
我有一个包含 5 亿行(并且还在增长)的表
我做了以下工作来提高插入的性能:
在数据库端:
在应用方面:
这给了我大约每秒 300 行
另外试过:
这给了我每秒大约 1k 行,但在空表上。但是当我用虚拟数据(每个表 200 万)填充表时,插入速度下降到每秒 250 - 300 次。
谁能建议我还能做些什么来加速插入?基本上我想首先了解什么是(可能是什么)瓶颈。
UPD: 表按插入日期分区,表有大约 60 列 - 大多数列是 VARCHAR2(2000 BYTE)
我正在实现从一个数据库到另一个数据库的特定于应用程序的数据导入功能。
我有一个包含 10000 行的 CSV 文件。这些行需要插入/更新到数据库中。
可能存在这样的情况,即数据库中可能存在几行,这意味着需要更新这些行。如果数据库中不存在,则需要插入它们。
一种可能的解决方案是,我可以一行一行地阅读,检查数据库中的条目并相应地构建插入/更新查询。但是这个过程可能需要很多时间来创建更新/插入查询并在数据库中执行它们。有时我的 CSV 文件可能有数百万条记录。
有没有其他更快的方法来实现这个功能?
如何将此查询转换为 SQLite:
UPDATE Table_1
INNER JOIN Table_2 ON (Table_1.Field1 = Table_2.Field1)
AND(Table_1.Field2 = Table_2.Field2)
SET Table_1.Field3 = Table_2.Field3
Run Code Online (Sandbox Code Playgroud)
这是我尝试过的。
UPDATE Table_1
SET Field3 = (SELECT Field3
FROM Table2
WHERE (Field1 = Table_2.Field1)
AND (Field2 = Table_2.Field2))
WHERE Field1 IN (SELECT Table_2.Field1
FROM Table2
WHERE (Field1 = Table_2.Field1)
AND (Field2 = Table_2.Field2))
AND Field2 IN (SELECT Table_2.Field2
FROM Table2
WHERE (Field1 = Table_2.Field1)
AND (Field2 = Table_2.Field2))
Run Code Online (Sandbox Code Playgroud)
查询有效,但我得到错误的结果。
大家好,大家对 mysql 都很陌生,我做了一个 java 程序,将数据存储在 mysql 数据库中。我正在使用这个名为 mysql-workbench 的工具,它可以创建数据库、表等等。我想要做的是查看我刚刚在我的java程序中填充数据的表的所有内容。我知道可以使用一些 SQL 脚本查看表的所有内容,但是我想知道 mysql-workbench 是否可以显示表中的所有内容,而无需以一种表格形式或类似于它们显示内容的方式输入 SELECT mysql 脚本phpMyAdmin 中的表。
我想这样做的原因是我在那个表中有 2-3k 个条目并且使用控制台有点混乱。有关如何执行此操作的任何帮助或建议?提前致谢。
我有以下 postgresql 函数:
CREATE OR REPLACE FUNCTION readMessage(messageFor INT, qid INT = NULL, ctxt INT = NULL, messageFrom INT = NULL, byTimeStamp BOOLEAN = FALSE)
RETURNS SETOF message
AS $$
DECLARE
sql varchar;
BEGIN
sql := 'SELECT * FROM message WHERE (receiver_id IS NULL OR receiver_id = $1)';
IF qid IS NOT NULL THEN
sql := sql || ' AND queue_id = $2';
END IF;
IF ctxt IS NOT NULL THEN
sql := sql || ' AND context = $3'; …Run Code Online (Sandbox Code Playgroud) 我在 Java 中有一个 Web 应用程序,它使用查询。我不想把查询写成Java,所以我做了一个函数:
CREATE OR REPLACE FUNCTION testFunc(inputs text) RETURNS TABLE(...) AS
$$
SELECT .... FROM ...
JOIN ...
where true
;
$$
LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
我希望函数参数 INPUTS 也位于 WHERE 子句中,因此如果输入是
AND speed = 0 AND ....
Run Code Online (Sandbox Code Playgroud)
Where 子句看起来像
where true AND speed = 0 AND ...
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
编辑
也可以接受许多参数(a int、b string、c string ..)但是我需要有
WHERE speed = * AND stop = * AND ...
Run Code Online (Sandbox Code Playgroud)
这是不可接受的。我怎样才能做到这一点?
或者我可以在里面放一个 if 语句吗?喜欢
Select .. . from ...
JOIN ...
WHERE true
IF (a …Run Code Online (Sandbox Code Playgroud) java ×10
oracle ×4
mysql ×3
functions ×2
postgresql ×2
dynamic-sql ×1
innodb ×1
insert ×1
jdbc ×1
mysql-5.6 ×1
sqlite ×1
transaction ×1
unicode ×1
utf-8 ×1