我需要进行大量的统计分析才能向用户提供一些数据。目前,我从 mysql 捕获数据并通过PHP数组处理它们。但是,mysql 临时表要好得多(比 PHP 数组效率更高、速度更快;显然是由于它们的机制)。
我的暂定解决方案是在每次请求(即连接)时形成一个临时表来导入和处理数据。但是,我不确定同时创建多个临时表是否有缺点?
这会给mysql服务器带来问题吗?或者我可以在众多同时请求中使用它作为 PHP 数组的替代方案?
innodb_read_io_threads和的默认值为innodb_write_io_threads4。如何检查您的服务器负载是否需要更高数量的线程?
正如我定期检查的那样show engine innodb status \G,没有可追踪的活动:
--------
FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
...
I/O thread 32 state: waiting for completed aio requests (write thread)
I/O thread 33 state: waiting for completed aio requests (write thread)
Pending normal aio reads: [0, 0, 0, 0, …Run Code Online (Sandbox Code Playgroud) 我在想这两种创建外键的方法是一样的
CREATE TABLE child1 (
id int(11) not null auto_increment,
parent_id int(11) REFERENCES parent_table(parent_id) ON DELETE CASCADE,
PRIMARY KEY(id)
);
Run Code Online (Sandbox Code Playgroud)
和
CREATE TABLE child2 (
id int(11) not null auto_increment,
parent_id int(11),
PRIMARY KEY(id),
FOREIGN KEY(parent_id) REFERENCES parent_table(parent_id) ON DELETE CASCADE
);
Run Code Online (Sandbox Code Playgroud)
但是当从父表中删除一条记录时,表中相应的记录child2将被删除,而不是表中的记录child1。
我哪里错了?REFERENCES是不够的,我们需要写FOREIGN KEY使用ON DELETE CASCADE?
对于这两个查询,我们是否体验到明显的性能差异?
INSERT INTO table (col1, col2, col3, col4, col5) ...
Run Code Online (Sandbox Code Playgroud)
和
INSERT INTO table (col5, col3, col1, col2, col4) ...
Run Code Online (Sandbox Code Playgroud)
是否需要INSERT按照表中列的顺序排列列?
创建具有复合PRIMARY KEY或UNIQUE INDEX用于两列的表可保证 col1、col2 的唯一性。是否有一种棘手的方法可以使两列的相反顺序也成为 UNIQUE (col2, col1)?
例如
PRIMARY KEY (col1, col2)
Run Code Online (Sandbox Code Playgroud)
或者
UNIQUE INDEX (col1, col2)
Run Code Online (Sandbox Code Playgroud)
如果我们有col1=33 && col2=54; 我们如何才能避免INSERT的col1=54 && col2=33?
在探索 InnoDB 的聚集 B 树索引系统时,我认为许多 NULL(或小)列的存在对 InnoDB 性能没有显着影响。
多余列的存在是否会降低 mysql 的性能?
PS我尝试了实际测试,但没有显着效果。不过我觉得应该是在重载的情况下比较的。这就是我很想了解关于这件事的技术推理的原因。
在表中作为
id name type info
1 BMW car yes
2 Reno car no
3 IBM electronics no
4 Sony electronics yes
5 Mazda car yes
Run Code Online (Sandbox Code Playgroud)
我GROUP_CONCAT用来获取每个的列表type,但我想将连接的列分隔为按列分类的多个列info。它应该是这样的
SELECT type,
GROUP_CONCAT(name) ORDER BY id ASC SEPARATOR ' ') AS list_with_info
GROUP_CONCAT(name) ORDER BY id ASC SEPARATOR ' ') AS list_without_info
FROM table1 GROUP BY type
Run Code Online (Sandbox Code Playgroud)
如何引入WHERE子句或使用其他方法返回多个连接列?
我有几列与UNIQUE INDEX. 在某些查询中,重复应该是可以接受的,其中应该将后缀添加到值中。例如,如果test title退出,我们将其更改为test title-2。
有没有办法让一个独特的价值DUPLICATE?
INSERT INTO table1
(title, abr, name)
VALUES
('title', 'abr', 'name')
Run Code Online (Sandbox Code Playgroud)
在这个典型示例中,所有三列都是UNIQUE. 当INSERT失败时,我不知道是哪个col导致错误改变了它对应的值。
如何进行查询value以value-identifier在重复错误时更改为?
考虑一个简单的更新为
SET @var1 = 20;
SET @var2 = 26;
UPDATE table1 SET
col1=IF(@var1>50, @var1 := @var1-col4, @var1 := @var1+col5),
col2=IF(@var2>50, @var2 := @var2-col6, @var2);
Run Code Online (Sandbox Code Playgroud)
我们如何在一种情况下改变两个变量。例如,考虑当 时@var1<50,我们不仅要更改@var1 := @var1+col5,还要重新分配@var2 := @var2 + 100。事实上,不管条件2,@var2如果第一个条件失败(第二部分),我们要增加。
是否可以在 a 中重新分配两个用户变量,IF STATEMENT或者我们需要添加另一个IF STATEMENT?
这将相当于
SET @var1 = 20;
SET @var2 = 26;
UPDATE table1 SET
col1=IF(@var1>50, @var1 := @var1-col4, @var1 := @var1+col5),
virtual_col=IF(@var1>50, NULL, @var2 := @var2+100),
col2=IF(@var2>50, @var2 := @var2-col6, @var2);
Run Code Online (Sandbox Code Playgroud)
在这里,我们已经创建了一个无用的列,而不是收集数据,但重复IF …
我UPDATE在管理员级别安排了大量查询,并且由于它们是UPDATE带有多个JOINs 的大量 s,因此消耗了大量资源。
我不希望他们在执行如此繁重的UPDATE任务时阻止最终用户执行基本任务。
是LOW_PRIORITY为了这个目的吗?或者我应该遵循另一种策略?
UPDATE LOW_PRIORITY ....
Run Code Online (Sandbox Code Playgroud)
请注意,我的引擎是innoDB.
mysql ×10
innodb ×5
performance ×3
duplication ×2
mysql-5.5 ×2
update ×2
foreign-key ×1
group-by ×1
insert ×1
mariadb ×1
memory ×1
mysql-5 ×1
null ×1
primary-key ×1
query ×1
select ×1
tuning ×1