为什么两个ID之间的查询直到结束时才锁定索引?
UPDATE elem SET c='' WHERE id BETWEEN 2 AND 5;
-- locks id>5 for some reason
数据库为MySQL 8.0.33GA。
这是一个完整的例子,摘自Daniel的“高效MySQL性能”一书。
CREATE TABLE `elem` (
`id` int unsigned NOT NULL PRIMARY KEY,
`a` char(2) NOT NULL,
`b` char(2) NOT NULL,
`c` char(2) NOT N
我们的Server 2014服务器正在Windows 2012 R2上运行。OS报告的驱动器空间属性显示,我们一天有17 GB空闲,第二天它显示我们只有718 MB空闲。在这段时间内,没有运行任何特定的查询或SQL作业。数据库maxsize设置为无限制(增长设置为10%),并执行以下查询:
SELECT (
SELECT SUM(CAST(df.size AS FLOAT))
FROM sys.database_files AS df
WHERE df.type IN (0, 2, 4)
)
每隔几秒钟,MySQL就会打开一个文件,而不是关闭它,我们可以通过查询实时地看到它。
SHOW GLOBAL STATUS WHERE variable_name = 'Open_files';
查看打开的文件描述符
sudo ls -la /proc/<pid>/fd | less
显示这些打开的文件大多被删除临时表:
lrwx------ 1 mysql mysql 64 Apr 17 08:56 990 -> /tmp/mysql_temptable.xTHQV4 (deleted)
lrwx------ 1 mysql mysql 64 Apr 17
我从这个问题开始:
我从这个问题中得到的答案是令人满意的。我有一个有2200万行的表,我想把它增长到大约1亿行。此时,表minute_data结构如下所示:
我遇到的一个问题如下。我需要执行以下查询:
select datediff(date,now()) from minute_data where symbol = "CSCO" order by date desc limit 1;
当表包含"CSCO“值时,速度非常快(<1秒)。问题是,有时我会查询一个已经不在表中的符号。当我执行这样的查询时,比方说,符号= "ABCD":
sele
我试图对不同列上的不同查询做一些基准测试,但MySQL就是不允许我这样做。在第一次执行查询之后,我再也无法获得该查询的相同执行时间。例如,如果第一次在0.062秒内执行查询,则在第二、第三和第三次运行时,我将永远无法获得相同的执行时间。要么是0秒钟,要么是0.015左右。
我读过许多关于禁用和清除MySQL查询缓存的文章,但它们对我没有任何帮助。
不管我做什么,MySQL似乎坚持使用缓存的结果。
我重新启动MySQL工作台,然后运行;
set global query_cache_type=0;
set global query_cache_size=0;
flush query cache
我需要将130万条记录从一个表插入到另一个表中,这需要很长时间(超过13分钟)。经过一些研究后,我发现分批进行这个操作更好,所以我把这样的操作组合在一起(实际的查询更复杂,这里简化为简洁):
DECLARE @key INT; SET @key = 0;
CREATE TABLE #CURRENT_KEYS(KEY INT)
WHILE 1=1
BEGIN
-- Getting subset of keys
INSERT INTO #CURRENT_KEYS(KEY)
SELECT TOP 100000 KEY FROM #ALL_KEYS WHERE KEY &g
DELIMITER //
DROP FUNCTION IF EXISTS TotalProductionCost;
CREATE FUNCTION TotalProductionCost(Abuilt int(10),Ucost Decimal(5,2) )
RETURNS Decimal(5,2)
BEGIN
DECLARE TotalCost Decimal(5,2);
SET TotalCost = Abuilt * Ucost;
RETURN TotalCost;
END //
DELIMITER ;
SELECT TotalProductionCost(10,1000) AS T