用MySQL表示,如果movies
表有20000条记录,并且每条记录都有一个字段是电影的描述,最长可达2k字节。我们如何在描述中搜索带有“自然”一词的电影?如果可能的话,它会很快,而不是通过所有20,000条记录。 (如果在其他情况下,如书籍,其中n
可以是200,000或更多)。在MySQL中,如果电影表具有描述字段,那么如何对此描述进行搜索?
1
A
回答
4
我不会直接处理说明列 - 关于选择的每行功能很少能很好地扩展。我订阅的准则之一是不需要在列内处理东西(类似于您的案例中的描述,或逗号分隔变量列的部分或甚至名称(第一/最后)和地址(街道/城镇/州) 组件)。如果你这样做,通常是更有效的方法。
我会做的是在表上插入,更新和删除触发器。对于插入/更新触发器,我会填充沿着DescLookup
下面几行另一个表:
Movies:
Id primary key
Title
Description
DescLookup:
Word
MovieId foreign key Movies(Id)
Count
primary key (Word,MovieId)
index (MovieId)
基本上,在描述(每个非干扰词即打折之类的东西and
,or
,by
,标点符号,单字母单词等),您会在此表中获得一个条目(使用较低的单词)。
确保触发器在重新填充之前删除该MovieId
的所有当前行,以免留下不正确的信息。
然后您使用该表来运行您的查询。这会将查找单词的“成本”移动到插入/更新中,而不是每一次选择,都会大大降低成本。这很有效,因为大部分数据库的读取次数远远多于写入次数,所以将成本转移到写入部分是个不错的主意。
请记住,为此需要额外的存储空间,但如果您检查人们对数据库询问的大量问题,“我该如何快速执行此操作?”远远超过“我如何使用更少的磁盘空间?”。
而删除触发器将简单地删除DescLookup
表中的所有条目以及相关的MovieId
。
因为Word
列索引(还有如你的要求,你会不会被搜索每一个描述字段),它的搜索将是快如闪电。这是因为:
select MovieId from DescLookup where Word = 'nature';
会吹:
select Id from Movies where lower(Description) like '%nature%';
出来的水。
2
在这种情况下,您希望使用全文搜索索引。要知道,有一些渔获不过,如最小的字,长度,停止字等
对FTS的语法如下:
WHERE MATCH (field) AGAINST ('text');
相关问题
- 1. 在所有表中搜索列描述描述元
- 2. 在描述中搜索
- 3. 结果表描述
- 4. 如在描述
- 5. 通过描述搜索
- 6. 如何在mysql中存储这些字段描述?
- 7. 如何访问mysql表字段模式描述列?
- 8. 新标准字段“描述”
- 9. 如何在JNI中找到对象的字段描述符?
- 10. 如何显示jmx MBean的类描述,属性描述和操作描述
- 11. 如何搜索Perforce中变更列表描述的文本?
- 12. 如何将元描述拖入搜索结果
- 13. VBA:如何描述具有特定字符串的行
- 14. 用%@描述对象(如UIButton,UIView,NSString,NSDictionary)的NSLog描述
- 15. 那么Zend_Feed “描述密钥丢失”
- 16. 描述文本在文本字段中?
- 17. 如何设计一个字段有很多描述的SQL表
- 18. RecordEditor - 字段描述该行的布局
- 19. 在PowerShell中列出具有空描述字段的用户
- 20. 如何在自动完成中搜索标签和描述
- 21. 在没有元标记描述的网站中提取描述?
- 22. 如何在IIS7中执行此步骤,通过IIS6描述
- 23. 如何在描述逻辑中表达此人
- 24. 维基百科长搜索描述
- 25. NSObject描述和调试描述
- 26. 类方法:描述“#my_class_method”或描述“#self.my_class_method”?
- 27. mysql搜索标题,描述和多行标记
- 28. 在XPCE中描述对象列表
- 29. 如何使用Flask将描述键与描述相关联
- 30. 描述表结构
这是一个非常酷的方法,但我猜OP已经有他的表填充。你能否建议一种方法让他从他现在的东西中产生起始数据集? – Drew 2010-05-25 04:59:29
是的,创建辅助表,设置插入/更新触发器,然后执行:'更新电影设置desc = desc;'。这应该激发数据库中每一行的触发器。如果你的数据库管理系统是如此聪明(或者鬼鬼祟祟的,IMNSHO),以至于不能认识到这是一个真正的更新,只需要:'更新电影集desc =''|| desc;更新电影集desc = substr(desc,2);'或类似的东西。 – paxdiablo 2010-05-25 05:03:26