mysql - 如何在 SQL 中索引列表数据以快速搜索某些元素或元素组?

标签 mysql sql rdbms

我将把单词的发音存储在 MySQL 表中,我希望有一种方法可以快速搜索具有特定属性的发音。

下面是一些数据的示例:

  • 明文词:“聚宝盆”
  • 发音:[“K”、“AO2”、“R”、“N”、“AH0”、“K”、“OW1”、“P”、“IY0”、“AH0”]

我能想到的存储列表数据的最简单方法是将列表转储为 json 编码的字符串。问题是该方法似乎不允许在该列上使用有用的索引。

以下是一些我希望能够快速运行的示例查询(相关数据已在我的数据库中编制索引):

  • 找出所有具有这个元音序列的发音:...
  • 找出所有在 YYY 位置有辅音 XXX 的发音。
  • 查找在最后位置有元音 XXX 的所有发音。
  • 找出其中某处具有此词汇重音序列的所有发音:[0, 2, 1]

我的一个想法是分离出词汇重音信息(上例中每个元音音素右侧的数字)并单独存储该重音信息(例如 [2, 0, 1, 0, 0 ]), 但即使那样我也不确定如何将它编入索引。

另一个似乎至少可以解决词汇重音查询的想法可能是将每个可能的词汇重音模式存储在一个单独的表中,然后让每个发音简单地引用(通过外键)这些词汇重音模式之一.然后我可以针对较小的一组可能的词汇重音模式运行我的 (Python) 服务器代码以确定哪些模式匹配,然后查询发音表以查找具有其中一种重音模式的发音。但我很想知道是否有某种方法可以创建更快的纯 SQL 解决方案。

但要明确一点:我感兴趣的主要问题是索引和查询音素列表。

最佳答案

最好的结构可能是每个音素一行的表格:

create table WordPhonemes (
    WordPhonemeId int auto_increment primary key,
    WordId int not null,
    Position int not null,
    Phoneme varchar(255),
    foreign key (WordId) references Words(WordId),
    index(WordId, Position),
    index(Phoneme),
    index(WordId, Phoneme)
);

并非您所有的查询都不一定那么简单。但是,索引会有所帮助。此外,如果 Words 表具有音素总数,也会有帮助。

关于mysql - 如何在 SQL 中索引列表数据以快速搜索某些元素或元素组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52313602/

相关文章:

javascript - 如何在 bookshelf.js 中设置我的数据库模型

sql - 如何通过 with 语句连接 postgresql 中的 3 个表

mysql - 两张 table 合二为一?

postgresql - 使用 UNION ALL 从多个表中获取行或在生产中使用一个表?

mysql - 数据库 "pointers"到行?

mysql - 无法远程连接到容器化 MySQL 数据库容器

mysql - Magento - 将 magento 从 1.6.2 更新到 1.7.0.2

sql - 优化在 pgAdmin 中比在应用程序中执行得更快的 postgresql 查询以及并发查询

sql - 存储过程返回 0 而不是值

php - PDO::lastInsertId() 可能不准确吗?