繁体   English   中英

SQLite 使用标签 map 变得太慢而且太大

[英]SQLite gets too slow and big with tag map

在阅读了许多关于优化数据库的帖子后,我决定重写我的 sqlite 数据库。 从.csv 创建的数据库,该文件列表大小约为 2700 MB。 为了测试,我只使用了 45 MB。

示例数据库表:

文件表:

CREATE TABLE 'files' ( 
'file_id' INT not null PRIMARY KEY, 
'name' TEXT, 
'ext' TEXT,
'category' INT, 
'size' INT, 
'date' INT
'width' INT,
'height' INT,
'status' INT,
'locked' INT,
'type' INT)

标签:

CREATE TABLE 'tags' ( 
'id' INT not null PRIMARY KEY, 
'name' TEXT, 
'category' INT, 
'file_count' INT,
'listener' INT)

标签和文件对:

CREATE TABLE 'tagmap' (
'file_id' INT,
'tag_id' INT, 
FOREIGN KEY('id') REFERENCES posts(id))

我得到的简单最快的请求:

SELECT files.*,(select group_concat(name) from tags 
where tags.id in (
select tag_id from tagmap where id=files.file_id
)) as tags FROM posts where files.id >3000 limit 100

*我需要在底部回答的问题

大多数列的第一个问题是 integer 并且在导入 csv 后,数据库变得很大(大约 65-75 Mb)。 大小不关心我,但只有大的 integer 是 id,最大的文本是之后解析的标签(测试 csv 155 000 行,原始文件约 550 万)。

第二个问题标签存储为字符串我决定使用多对多系统来提高性能。 创建标签 map 后,系统数据库增长更多(使用VACUUMREINDEX后大约 140MB),尽管有很多重复标签。 从原始文件标签表中提取的所有内容仅消耗 21 Mb 并包含 862 196 行。 但是标签 ID 和文件 ID 对占用大约 60 Mb 和 5 499 514 行(有些文件有 3-7 个标签,有些是 30-50)。 如果多次使用相同的标签,文件大小如何变得如此之大? 有没有更有效的方法来存储 integer 对。

第三个问题它变慢了。 无索引约 15 秒,有索引约 1-3 秒。 不是那么慢,但文件更大,我的电脑控制台看起来像冻结了。 旧的 sqlite 数据库在同一个表中的标签比LIKE更快。

我想知道:

  1. 有没有更好的方法来存储标签或标签对?
  2. 将 integer 存储在 SQLite 中的最佳方法是什么(如无符号值作为字节或其他内容)。
  3. 我应该使用 mySql 代替 SQLite 吗?
  4. 还有其他方法可以提高 SQLite 的性能吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM