1
incompatible 2014-07-23 11:17:52 +08:00
你的表设计本身就没什么问题(除了用word作为keywords表的主键这一部分。 我看不出来有什么理由要这样做)
多表关联在设计业务系统时是很普遍的用法,你不应该怕麻烦 另外: 这种写法性能差select * from keywords where id in(select keywordid from articleskeywordsrelates where articleid=5) 建议改成 select kw.* from keywords kw join articlekeywordsrelates akr on kw.id=akr.keywordid where akr.articleid=5 关于你标题的问题 http://dba.stackexchange.com/questions/232/character-vs-integer-primary-keys |
2
sampeng 2014-07-23 14:41:10 +08:00
汉字的根本是二进制。
字符串对比。性能100%不会比int型对比快。你放弃吧 |
3
dbfox OP @sampeng
@incompatible 好吧,感谢 回复 同时我想到了比较好的办法, 既简单又高效 (自己实验过性能,同时认为有一定的便捷性) 这个其实我很早就在用,今天特意实验了下性能,测试了下 比 in 性能高出几十倍 结构如下: [keywords] id name [articles] id title keywords 数据示例如下: [keywords] id name 1 苹果 2 安卓 3 游戏 4 wp 5 编程 6 CSS 7 JS 8 Javascript [articles] id title keywords 1 xxx /苹果/游戏/编程/js/ 2 xxx /安卓/wp/编程/js/ 3 xxx /游戏/CSS/编程/js/ 4 xxx /CSS/wp/编程/js/ 5 xxx /Javascript/wp/编程/js/ 查出 id为5 的所有关键字 [SQLServer] mysql locate 代替 charindex select * from keywords where CharIndex('/'+Name+'/',(select keywords from articles where id=5))>0 简单点就是如下: select * from keywords where CharIndex('/'+Name+'/','/Javascript/wp/编程/js/')>0 如果不想破坏关系的话,可以保留 articleskeywords 关系表 |
4
sampeng 2014-07-24 16:33:47 +08:00
原来是这个需求。。。。关系表绰绰有余。多对多即可。。
可维护性和代码的可理解程度都比这个强百倍。性能?多对多建好索引。不会比你这个一条一条查慢。。你这种查询,索引是一点都用不到的。直接全表查找。小数据ok。大数据。。你explain就知道了。 |
5
sampeng 2014-07-24 16:35:25 +08:00
如果没数据量的要求就无所谓了。
有一点很重要啦~性能和可维护性。要平衡。。如果快出的性能是无所谓的。。选择可维护性。 |
6
sampeng 2014-07-24 17:09:57 +08:00
用in肯定慢。。你用left join啊。。
in和left join的解析和实现过程完全不是一回事。只有没有办法的办法 |