从数据库加载完整的 ID 列表还是一次执行一条记录?什么最好?
Load a full list of IDs from DB or perform one record at a time ? What's best?
我将一个定制网站迁移到 WordPress,首先我必须从以前的网站迁移数据,然后,每天我都必须使用 API.
我喜欢插入的数据,带有一个唯一的 ID,代表一场足球比赛。
为了避免多次插入同一个游戏,我做了一个数据库table,结构如下:
CREATE TABLE `ss_highlight_ids` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`highlight_id` int(10) unsigned zerofill NOT NULL DEFAULT '0000000000',
PRIMARY KEY (`id`),
UNIQUE KEY `highlight_id_UNIQUE` (`highlight_id`),
KEY `highlight_id_INDEX` (`highlight_id`) COMMENT 'Contains a list with all the highlight IDs. This is used as index, and dissalow the creation of double records.'
) ENGINE=InnoDB AUTO_INCREMENT=2967 DEFAULT CHARSET=latin1
当我尝试在我的 WordPress 数据库中插入一条新记录时,我首先想查找这个 table,看看该 ID 是否已经存在。
现在的问题:)
什么比较好?要使用单个 SQL 查询加载所有 ID,然后使用纯 PHP 检查当前游戏 ID 是否存在,还是查询数据库中我插入的任何一行更好?
我知道 MySQL 查询很耗资源,但从另一方面来说,目前我在这个 table 中有大约 3k 条记录,并且在接下来的几个时间里会超过 30 - 40k年,所以我不知道将所有这些记录加载到 PHP 中是否是一个好习惯?
你有什么意见/建议?
更新#1
我刚刚发现我的 table 有 272KiB 大小和 2966 行。这意味着在附近的功能中,它的大小似乎约为 ~8000KiB+ 大小,并且还在继续。
更新#2
可能我没说的太清楚。对于第一次插入,我必须迭代一个包含大约 12K 条记录的 CSV 文件,每天插入 CSV 文件后,我将插入大约 100 - 200 条记录。所有这些记录都需要在 table 中使用 ID 进行查找。
所以确切的问题是,在 CSV 插入时在 MySQL 中创建 12K 查询然后每天大约 100 - 200 MySQL 查询更好,还是只在服务器中加载 ID内存,并使用 PHP 进行查找 ?
您的 table 有一个列 id
,它是 auto_increment,这意味着不需要在该列中插入任何内容。它会自己填满它。
highlight_id
是UNIQUE
,所以也可能是PRIMARY KEY
;如果 id
.
就摆脱
一个PRIMARY KEY
是一个UNIQUE
键是一个INDEX
。所以这是多余的:
KEY `highlight_id_INDEX` (`highlight_id`)
回到您的问题...SQL 设计 以分批处理。不要通过一次做一行来打败它。
如果 table 只有两列和 2966 行,它怎么可能是 272KiB 大小?如果table中有更多的列;让他们看。关于您在做什么以及如何提高效率,通常会有很好的线索。
2966 行是'trivial';您将不得不仔细查看性能差异。
正在从 CSV 加载...
如果这是替换,请使用加载数据,构建一个新的 table,然后重命名以将其放置到位。一个 CREATE,一个 LOAD,一个 RENAME,一个 DROP。比任何类型的 100 个查询都高效得多。
如果 CSV 是 updates/inserts,加载到临时 table,然后执行 INSERT ... ON DUPLICATE KEY UPDATE ...
执行 updates/inserts 到真正的 table。一次创建,一次加载,一次 IODKU。比任何类型的 100 个查询都高效得多。
如果 CSV 是其他内容,请详细说明。
我将一个定制网站迁移到 WordPress,首先我必须从以前的网站迁移数据,然后,每天我都必须使用 API.
我喜欢插入的数据,带有一个唯一的 ID,代表一场足球比赛。
为了避免多次插入同一个游戏,我做了一个数据库table,结构如下:
CREATE TABLE `ss_highlight_ids` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`highlight_id` int(10) unsigned zerofill NOT NULL DEFAULT '0000000000',
PRIMARY KEY (`id`),
UNIQUE KEY `highlight_id_UNIQUE` (`highlight_id`),
KEY `highlight_id_INDEX` (`highlight_id`) COMMENT 'Contains a list with all the highlight IDs. This is used as index, and dissalow the creation of double records.'
) ENGINE=InnoDB AUTO_INCREMENT=2967 DEFAULT CHARSET=latin1
当我尝试在我的 WordPress 数据库中插入一条新记录时,我首先想查找这个 table,看看该 ID 是否已经存在。
现在的问题:)
什么比较好?要使用单个 SQL 查询加载所有 ID,然后使用纯 PHP 检查当前游戏 ID 是否存在,还是查询数据库中我插入的任何一行更好?
我知道 MySQL 查询很耗资源,但从另一方面来说,目前我在这个 table 中有大约 3k 条记录,并且在接下来的几个时间里会超过 30 - 40k年,所以我不知道将所有这些记录加载到 PHP 中是否是一个好习惯?
你有什么意见/建议?
更新#1
我刚刚发现我的 table 有 272KiB 大小和 2966 行。这意味着在附近的功能中,它的大小似乎约为 ~8000KiB+ 大小,并且还在继续。
更新#2
可能我没说的太清楚。对于第一次插入,我必须迭代一个包含大约 12K 条记录的 CSV 文件,每天插入 CSV 文件后,我将插入大约 100 - 200 条记录。所有这些记录都需要在 table 中使用 ID 进行查找。
所以确切的问题是,在 CSV 插入时在 MySQL 中创建 12K 查询然后每天大约 100 - 200 MySQL 查询更好,还是只在服务器中加载 ID内存,并使用 PHP 进行查找 ?
您的 table 有一个列 id
,它是 auto_increment,这意味着不需要在该列中插入任何内容。它会自己填满它。
highlight_id
是UNIQUE
,所以也可能是PRIMARY KEY
;如果 id
.
一个PRIMARY KEY
是一个UNIQUE
键是一个INDEX
。所以这是多余的:
KEY `highlight_id_INDEX` (`highlight_id`)
回到您的问题...SQL 设计 以分批处理。不要通过一次做一行来打败它。
如果 table 只有两列和 2966 行,它怎么可能是 272KiB 大小?如果table中有更多的列;让他们看。关于您在做什么以及如何提高效率,通常会有很好的线索。
2966 行是'trivial';您将不得不仔细查看性能差异。
正在从 CSV 加载...
如果这是替换,请使用加载数据,构建一个新的 table,然后重命名以将其放置到位。一个 CREATE,一个 LOAD,一个 RENAME,一个 DROP。比任何类型的 100 个查询都高效得多。
如果 CSV 是 updates/inserts,加载到临时 table,然后执行 INSERT ... ON DUPLICATE KEY UPDATE ...
执行 updates/inserts 到真正的 table。一次创建,一次加载,一次 IODKU。比任何类型的 100 个查询都高效得多。
如果 CSV 是其他内容,请详细说明。