我在 MySQL 中使用递归存储过程来生成一个名为 的临时表id_list,但我必须在后续选择查询中使用该过程的结果,所以我不能DROP在过程中使用临时表...
BEGIN;
/* generates the temporary table of ID's */
CALL fetch_inheritance_groups('abc123',0);
/* uses the results of the stored procedure in the WHERE */
SELECT a.User_ID
FROM usr_relationships r
INNER JOIN usr_accts a ON a.User_ID = r.User_ID
WHERE r.Group_ID = 'abc123' OR r.Group_ID IN (SELECT * FROM id_list)
GROUP BY r.User_ID;
COMMIT;
Run Code Online (Sandbox Code Playgroud)
调用过程时,第一个值是我想要的分支的顶部 ID,第二个值是tier过程在递归过程中使用的ID 。在递归循环之前,它会检查tier = 0它是否运行以及是否运行:
DROP TEMPORARY TABLE IF EXISTS id_list;
CREATE TEMPORARY TABLE IF NOT EXISTS …Run Code Online (Sandbox Code Playgroud) 我找不到任何东西,所以我确定答案是否定的,你是什么,菜鸟?但我觉得无论如何都有必要问:)
是否有一个简单的实用程序可以允许在现有主服务器上启动新的从服务器,而无需在主服务器上执行转储?
我已经多次以传统方式设置奴隶,所以我并非不了解这个过程,但我很好奇是否有人和我有同样的感觉,一定有更简单的方法。
我希望这样的实用程序会使用类似于 Percona 的 Xtrabackup 的东西,但它不会输出到转储文件,而是将输出直接流式传输到从属,然后在提要结束后自动启用从属关系。
这是现实的吗?
我注意到 Xtrabackup 中的流选项,但在其仅将 tar 保存在另一台服务器上的能力之外找不到示例,这不是我想要的。我想要一个可以直接流入目标数据库的解决方案,而根本不需要使用转储文件。这在处理大型数据集时特别方便。
我最初使用“handlersocket”插件来对 InnoDB 表进行 NoSQL 访问,然后它最终无法构建在较新的版本上,因此我迁移到了 Oracle 正在引入的“Memcached”插件,它似乎是一个很好的长期替代品。
现在插件文档上有一条通知,“InnoDB memcached 插件从 MySQL 8.0.22 开始已弃用”。
有谁知道为什么,其次,这是否意味着它不会再被烘焙,但在需要时仍然可以编译,或者插件的开发已经停止?如果是后者,是否有更新/不同的选项用于通过套接字访问表来跳过查询优化器的开销?我不明白为什么那些增加了如此多效率和灵活性的东西会被如此毫不客气地丢弃:(
这可能看起来很愚蠢,但是在为我们的数据库中命名索引时试图坚持我的标准命名法时,最新的命名法有点冗长,而且像 DB 的所有事物一样,我想知道它是否会以任何方式对性能产生负面影响。我只是不确定索引名称的实际存储或使用方式与实际列数据的位置或方式。
例如,命名索引epoid与命名索引是否有利ecm_products_options_product_id?
后者更接近我们的标准,并且在应用层更容易阅读和识别。
我们使用大量关联表来管理系统中各种不同对象之间的一对多关系。
为了说明这个问题,举两个例子:
users, events, ass_users_events. 在ass_users_events将只包含User_ID与Event_ID列,都与外键关系。projects, tasks, ass_projects_tasks. 在ass_projects_tasks将只包含Project_ID与Task_ID列,都与外键关系。NB1:每个对象表实际上都使用了一个自动递增整数主键和一个带有唯一索引的 UUID 列的组合,该索引是实际的记录 ID。出于这个问题的目的,我们仅使用 UUID,因此不会发生冲突。
NB2:我们使用这种格式而不是直接的外键列/索引的原因是实际情况比这个例子复杂得多,许多不同的表有许多不同的连接,我们不希望 ORM 做很多每次加载记录时进行不必要的工作。
问题是我们开始为系统中的几乎所有新对象类型为系统中的许多其他现有对象创建这些关联表,从长远来看,这似乎不可持续,我们最终会数百种关联类型。
我们正在考虑的一个潜在解决方案是摆脱所有当前的关联表,而是创建一个具有以下结构的表:obj_1_id, obj_1_type, obj_2_id, obj_2_type。每列都将被索引,可能作为复合索引(即INDEX object_1 (obj_1_type,obj_1_id)和INDEX object_2 (obj_2_type,obj_2_id))。
上面屁股表中的示例将变为:abc,user,123,event, 和def,project,456,task。
该解决方案使我们能够灵活地在不同对象之间构建任意数量的关系类型,并且 ass 表上有足够的索引以保持性能。我的问题是,仅在连接期间使用索引与在较小的表中定义外键关系相比是否存在缺点,但可能有数百个?
编辑: 我认为下面有一些误解,所以这可能会澄清一些事情:
我使用多态对象结构,但每个对象都存储在它自己的表中,即用户、产品、类别、事件等。
至于提议的 ass 表,它将只有 4 个功能字段,具有非常简单的数据类型(加上一个ai_col作为主要数据类型)。typecols的数据类型为 varchar(10),id 的数据类型为CHAR(32) / BINARY(16)。SELECT …
mysql ×5
index ×2
backup ×1
index-tuning ×1
innodb ×1
join ×1
memcached ×1
memory ×1
mysql-8.0 ×1
mysqldump ×1
percona ×1
performance ×1
replication ×1
xtrabackup ×1