MySQL能否直接读取CSV文件而非导入?求类似PostgreSQL外部表方案
MySQL 中类似 PostgreSQL 外部表的 CSV 访问方案
针对你需要直接访问实时重写的CSV文件、无需导入的需求,MySQL有两种主流实现方式:
1. 原生CSV存储引擎(需配合手动刷新)
MySQL自带CSV存储引擎,可直接将CSV文件映射为数据库表,文件重写后需手动触发刷新才能读取最新内容:
创建关联CSV的表
CREATE TABLE IF NOT EXISTS rawdata.system_ps ( pid TEXT, started TEXT, cpu_pcnt TEXT, mem_pcnt TEXT, command TEXT ) ENGINE=CSV DEFAULT CHARACTER SET utf8mb4 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES; -- 忽略首行表头,对应PostgreSQL的HEADER 'true'
注意事项
- 需要将CSV文件放到MySQL数据目录下的
rawdata子目录(对应表的schema),或者通过DATA DIRECTORY参数指定自定义路径(需确保MySQL进程对该路径有读写权限)。 - 当crontab重写CSV文件后,执行以下命令让MySQL重新读取文件:
FLUSH TABLES rawdata.system_ps;
2. CONNECT存储引擎(实时读取,无需手动刷新)
CONNECT是第三方存储引擎,支持直接访问任意路径下的CSV文件,且能实时读取最新内容,无需手动刷新,更贴合你的场景:
创建外部CSV表
CREATE TABLE IF NOT EXISTS rawdata.system_ps ( pid TEXT, started TEXT, cpu_pcnt TEXT, mem_pcnt TEXT, command TEXT ) ENGINE=CONNECT DEFAULT CHARACTER SET utf8mb4 TABLE_TYPE=CSV FILE_NAME='/var/tmp/system_ps.csv' HEADER=1; -- 表示文件包含表头行
注意事项
- CONNECT引擎默认不随MySQL安装,需要单独安装(部分Linux发行版的MySQL扩展包会包含,也可自行编译)。
- 确保MySQL进程对
/var/tmp/system_ps.csv路径有读取权限。
你提供的PostgreSQL外部表代码(中文翻译)
-- 若不存在则创建rawdata模式下的system_ps外部表 CREATE FOREIGN TABLE IF NOT EXISTS rawdata.system_ps ( pid 文本, started 文本, cpu_pcnt 文本, mem_pcnt 文本, command 文本 ) -- 使用名为"import"的外部服务器 SERVER "import" OPTIONS ( FILENAME '/var/tmp/system_ps.csv', -- 指定CSV文件路径 FORMAT 'csv', -- 数据格式为CSV HEADER 'true' -- 文件包含表头行 );
内容的提问来源于stack exchange,提问作者Steve Lloyd
相关产品推荐
相关产品推荐

