• 关于

    相关检索是啥

    的搜索结果

回答

忘记这茬了,ldconfig,已经解决 ###### 哈, 自问自答.....    话说, friso并没有提供--help文档, 只有一个开发帮助的pdf文档... ###### 引用来自“狮子的魂”的答案 哈, 自问自答.....    话说, friso并没有提供--help文档, 只有一个开发帮助的pdf文档... 我用是会用了,我不知道这玩意具体的使用场景是啥?分词的话搜索引擎都会帮你做了呀。。 ###### 信息检索, 语音合成, 语音识别, 文本自动分类, 机器翻译, 关键字提取....... 其中在信息检索中用的最多, 一般的全文索引组建没有提供中文分词工具, 例如: xapian, zebra等.... 都没有..... 如果是用在php里面的话, 我提供了一个robbe扩展... ###### 另外搜索引擎和全文索引是不一样的: 搜索引擎包括: 网络爬虫, 文档处理(去重...), 全文索引(需要中文分词), 查询接口. 我们通常用的是"全文索引"类库, 只是搜索引擎的一部分, 而这些类库基本都是国外的, 加上中文分词的复杂, 里面一般都没有中文分词的类库, 就像lucene, 自带的不好用... ###### 引用来自“狮子的魂”的答案 信息检索, 语音合成, 语音识别, 文本自动分类, 机器翻译, 关键字提取....... 其中在信息检索中用的最多, 一般的全文索引组建没有提供中文分词工具, 例如: xapian, zebra等.... 都没有..... 如果是用在php里面的话, 我提供了一个robbe扩展... 嗯,受教了,我用的是coreseek,这个是基于俄罗人开发的sphinx的。 我测试了下如果用你开发的这套东西的话,我可以用原生的sphinx了。例如搜索“广州市人民医院”,直接通过robbe 分成“广州市” “人民“ “医院”,然后直接放到sphinx API里去搜,我用的对吗? ###### 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... ###### 引用来自“狮子的魂”的答案 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... 修改sphinx的话对于我来说现在难度太大了,之前是用shinx_for_chinese,但是这玩意在建立索引的时候就已经把词分好了, 所以才导致这种结果:例如搜“广州市物友电子科技有限公司”可以搜到,但是你搜“广州市物友电子科技有限”就搜不到“广州市物友电子科技有限公司”了。后来我就转coreseek了,这玩意的分词是libmmseg,和你的friso一样都是基于mmseg算法实现的,用的是最新测试版的,在线上运行的时候,--rotate建索引的时候出问题了,貌似是BUG,也查不到个所以然,再说这玩意有些年头没更新了,稳定版还是基于sphinx0.9.9的,回退到这个版本的话API里很多东西都不适用了。现在我看到你开发的这个东西,感觉应该适合我们,这样的话可以用原生的sphinx,我打算好好测试测试,但是你推荐第一种,我用第二种会有问题吗? ###### 引用来自“狮子的魂”的答案 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... 汗,我的数据量是30W的100倍啊,呵呵。如果mysql能解决的话,就好了。。。 ###### 引用来自“宝仔love”的答案 引用来自“狮子的魂”的答案 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... 修改sphinx的话对于我来说现在难度太大了,之前是用shinx_for_chinese,但是这玩意在建立索引的时候就已经把词分好了, 所以才导致这种结果:例如搜“广州市物友电子科技有限公司”可以搜到,但是你搜“广州市物友电子科技有限”就搜不到“广州市物友电子科技有限公司”了。后来我就转coreseek了,这玩意的分词是libmmseg,和你的friso一样都是基于mmseg算法实现的,用的是最新测试版的,在线上运行的时候,--rotate建索引的时候出问题了,貌似是BUG,也查不到个所以然,再说这玩意有些年头没更新了,稳定版还是基于sphinx0.9.9的,回退到这个版本的话API里很多东西都不适用了。现在我看到你开发的这个东西,感觉应该适合我们,这样的话可以用原生的sphinx,我打算好好测试测试,但是你推荐第一种,我用第二种会有问题吗? 呵呵……这个当初在robbe-1.0发布的时候我就取用它测试了sphinx0.9.9。效果很好,就是用base64转吗也很高效,但是那时候friso1.0的分词效果还不是很好。现在分词好了搜索的精准度高些了。就是那个相关度排序的问题,不知道转换了base64编码后跟中文的相关度是否与误差!

爱吃鱼的程序员 2020-06-02 15:03:04 0 浏览量 回答数 0

回答

忘记这茬了,ldconfig,已经解决 ###### 哈, 自问自答.....    话说, friso并没有提供--help文档, 只有一个开发帮助的pdf文档... ###### 引用来自“狮子的魂”的答案 哈, 自问自答.....    话说, friso并没有提供--help文档, 只有一个开发帮助的pdf文档... 我用是会用了,我不知道这玩意具体的使用场景是啥?分词的话搜索引擎都会帮你做了呀。。 ###### 信息检索, 语音合成, 语音识别, 文本自动分类, 机器翻译, 关键字提取....... 其中在信息检索中用的最多, 一般的全文索引组建没有提供中文分词工具, 例如: xapian, zebra等.... 都没有..... 如果是用在php里面的话, 我提供了一个robbe扩展... ###### 另外搜索引擎和全文索引是不一样的: 搜索引擎包括: 网络爬虫, 文档处理(去重...), 全文索引(需要中文分词), 查询接口. 我们通常用的是"全文索引"类库, 只是搜索引擎的一部分, 而这些类库基本都是国外的, 加上中文分词的复杂, 里面一般都没有中文分词的类库, 就像lucene, 自带的不好用... ###### 引用来自“狮子的魂”的答案 信息检索, 语音合成, 语音识别, 文本自动分类, 机器翻译, 关键字提取....... 其中在信息检索中用的最多, 一般的全文索引组建没有提供中文分词工具, 例如: xapian, zebra等.... 都没有..... 如果是用在php里面的话, 我提供了一个robbe扩展... 嗯,受教了,我用的是coreseek,这个是基于俄罗人开发的sphinx的。 我测试了下如果用你开发的这套东西的话,我可以用原生的sphinx了。例如搜索“广州市人民医院”,直接通过robbe 分成“广州市” “人民“ “医院”,然后直接放到sphinx API里去搜,我用的对吗? ###### 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... ###### 引用来自“狮子的魂”的答案 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... 修改sphinx的话对于我来说现在难度太大了,之前是用shinx_for_chinese,但是这玩意在建立索引的时候就已经把词分好了, 所以才导致这种结果:例如搜“广州市物友电子科技有限公司”可以搜到,但是你搜“广州市物友电子科技有限”就搜不到“广州市物友电子科技有限公司”了。后来我就转coreseek了,这玩意的分词是libmmseg,和你的friso一样都是基于mmseg算法实现的,用的是最新测试版的,在线上运行的时候,--rotate建索引的时候出问题了,貌似是BUG,也查不到个所以然,再说这玩意有些年头没更新了,稳定版还是基于sphinx0.9.9的,回退到这个版本的话API里很多东西都不适用了。现在我看到你开发的这个东西,感觉应该适合我们,这样的话可以用原生的sphinx,我打算好好测试测试,但是你推荐第一种,我用第二种会有问题吗? ###### 引用来自“狮子的魂”的答案 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... 汗,我的数据量是30W的100倍啊,呵呵。如果mysql能解决的话,就好了。。。 ###### 引用来自“宝仔love”的答案 引用来自“狮子的魂”的答案 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... 修改sphinx的话对于我来说现在难度太大了,之前是用shinx_for_chinese,但是这玩意在建立索引的时候就已经把词分好了, 所以才导致这种结果:例如搜“广州市物友电子科技有限公司”可以搜到,但是你搜“广州市物友电子科技有限”就搜不到“广州市物友电子科技有限公司”了。后来我就转coreseek了,这玩意的分词是libmmseg,和你的friso一样都是基于mmseg算法实现的,用的是最新测试版的,在线上运行的时候,--rotate建索引的时候出问题了,貌似是BUG,也查不到个所以然,再说这玩意有些年头没更新了,稳定版还是基于sphinx0.9.9的,回退到这个版本的话API里很多东西都不适用了。现在我看到你开发的这个东西,感觉应该适合我们,这样的话可以用原生的sphinx,我打算好好测试测试,但是你推荐第一种,我用第二种会有问题吗? 呵呵……这个当初在robbe-1.0发布的时候我就取用它测试了sphinx0.9.9。效果很好,就是用base64转吗也很高效,但是那时候friso1.0的分词效果还不是很好。现在分词好了搜索的精准度高些了。就是那个相关度排序的问题,不知道转换了base64编码后跟中文的相关度是否与误差!

爱吃鱼的程序员 2020-05-30 14:01:40 0 浏览量 回答数 0

回答

忘记这茬了,ldconfig,已经解决 ###### 哈, 自问自答.....    话说, friso并没有提供--help文档, 只有一个开发帮助的pdf文档... ###### 引用来自“狮子的魂”的答案 哈, 自问自答.....    话说, friso并没有提供--help文档, 只有一个开发帮助的pdf文档... 我用是会用了,我不知道这玩意具体的使用场景是啥?分词的话搜索引擎都会帮你做了呀。。 ###### 信息检索, 语音合成, 语音识别, 文本自动分类, 机器翻译, 关键字提取....... 其中在信息检索中用的最多, 一般的全文索引组建没有提供中文分词工具, 例如: xapian, zebra等.... 都没有..... 如果是用在php里面的话, 我提供了一个robbe扩展... ###### 另外搜索引擎和全文索引是不一样的: 搜索引擎包括: 网络爬虫, 文档处理(去重...), 全文索引(需要中文分词), 查询接口. 我们通常用的是"全文索引"类库, 只是搜索引擎的一部分, 而这些类库基本都是国外的, 加上中文分词的复杂, 里面一般都没有中文分词的类库, 就像lucene, 自带的不好用... ###### 引用来自“狮子的魂”的答案 信息检索, 语音合成, 语音识别, 文本自动分类, 机器翻译, 关键字提取....... 其中在信息检索中用的最多, 一般的全文索引组建没有提供中文分词工具, 例如: xapian, zebra等.... 都没有..... 如果是用在php里面的话, 我提供了一个robbe扩展... 嗯,受教了,我用的是coreseek,这个是基于俄罗人开发的sphinx的。 我测试了下如果用你开发的这套东西的话,我可以用原生的sphinx了。例如搜索“广州市人民医院”,直接通过robbe 分成“广州市” “人民“ “医院”,然后直接放到sphinx API里去搜,我用的对吗? ###### 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... ###### 引用来自“狮子的魂”的答案 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... 修改sphinx的话对于我来说现在难度太大了,之前是用shinx_for_chinese,但是这玩意在建立索引的时候就已经把词分好了, 所以才导致这种结果:例如搜“广州市物友电子科技有限公司”可以搜到,但是你搜“广州市物友电子科技有限”就搜不到“广州市物友电子科技有限公司”了。后来我就转coreseek了,这玩意的分词是libmmseg,和你的friso一样都是基于mmseg算法实现的,用的是最新测试版的,在线上运行的时候,--rotate建索引的时候出问题了,貌似是BUG,也查不到个所以然,再说这玩意有些年头没更新了,稳定版还是基于sphinx0.9.9的,回退到这个版本的话API里很多东西都不适用了。现在我看到你开发的这个东西,感觉应该适合我们,这样的话可以用原生的sphinx,我打算好好测试测试,但是你推荐第一种,我用第二种会有问题吗? ###### 引用来自“狮子的魂”的答案 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... 汗,我的数据量是30W的100倍啊,呵呵。如果mysql能解决的话,就好了。。。 ###### 引用来自“宝仔love”的答案 引用来自“狮子的魂”的答案 分词重点用在索引的建立和查询过程. 1. 你可以修改sphinx, 将friso内嵌到sphinx当作默认的分词程序. 然后你的spinx的调用接口不变.... 2. 我先前是将利用robbe分词(因为是给php用), 然后在将切分结果base64编码, 再将编码后的词条使用空格串接起来.  在给sphinx用, sphinx会自动用自带的英文分词程序再切分.. http://my.oschina.net/jcseg/blog/111106 里面的示例代码兴许会有帮助. 最好的办法是第一种(但是, 需要对sphinx设计比较熟悉, 才能很好的将friso嵌入到sphinx作为默认的分词程序), 第二种最简单... 修改sphinx的话对于我来说现在难度太大了,之前是用shinx_for_chinese,但是这玩意在建立索引的时候就已经把词分好了, 所以才导致这种结果:例如搜“广州市物友电子科技有限公司”可以搜到,但是你搜“广州市物友电子科技有限”就搜不到“广州市物友电子科技有限公司”了。后来我就转coreseek了,这玩意的分词是libmmseg,和你的friso一样都是基于mmseg算法实现的,用的是最新测试版的,在线上运行的时候,--rotate建索引的时候出问题了,貌似是BUG,也查不到个所以然,再说这玩意有些年头没更新了,稳定版还是基于sphinx0.9.9的,回退到这个版本的话API里很多东西都不适用了。现在我看到你开发的这个东西,感觉应该适合我们,这样的话可以用原生的sphinx,我打算好好测试测试,但是你推荐第一种,我用第二种会有问题吗? 呵呵……这个当初在robbe-1.0发布的时候我就取用它测试了sphinx0.9.9。效果很好,就是用base64转吗也很高效,但是那时候friso1.0的分词效果还不是很好。现在分词好了搜索的精准度高些了。就是那个相关度排序的问题,不知道转换了base64编码后跟中文的相关度是否与误差!

优选2 2020-06-05 11:37:47 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

回答

前言 这期我想写很久了,但是因为时间的原因一直拖到了现在,我以为一两天就写完了,结果从构思到整理资料,再到写出来用了差不多一周的时间吧。 你们也知道丙丙一直都是创作鬼才来的,所以我肯定不会一本正经的写,我想了好几个切入点,最后决定用一个完整的电商系统作为切入点,带着大家看看,我们需要学些啥,我甚至还收集配套视频和资料,暖男石锤啊,这期是呕心沥血之作,不要白嫖了。 正文 在写这个文章之前,我花了点时间,自己臆想了一个电商系统,基本上算是麻雀虽小五脏俱全,我今天就用它开刀,一步步剖析,我会讲一下我们可能会接触的技术栈可能不全,但是够用,最后给个学习路线。 Tip:请多欣赏一会,每个点看一下,看看什么地方是你接触过的,什么技术栈是你不太熟悉的,我觉得还算是比较全的,有什么建议也可以留言给我。 不知道大家都看了一下没,现在我们就要庖丁解牛了,我从上到下依次分析。 前端 你可能会会好奇,你不是讲后端学习路线嘛,为啥还有前端的部分,我只能告诉你,傻瓜,肤浅。 我们可不能闭门造车,谁告诉你后端就不学点前端了? 前端现在很多也了解后端的技术栈的,你想我们去一个网站,最先接触的,最先看到的是啥? 没错就是前端,在大学你要是找不到专门的前端同学,去做系统肯定也要自己顶一下前端的,那我觉得最基本的技术栈得熟悉和了解吧,丙丙现在也是偶尔会开发一下我们的管理系统主要是VUE和React。 在这里我列举了我目前觉得比较简单和我们后端可以了解的技术栈,都是比较基础的。 作为一名后端了解部分前端知识还是很有必要的,在以后开发的时候,公司有前端那能帮助你前后端联调更顺畅,如果没前端你自己也能顶一下简单的页面。 HTML、CSS、JS、Ajax我觉得是必须掌握的点,看着简单其实深究或者去操作的话还是有很多东西的,其他作为扩展有兴趣可以了解,反正入门简单,只是精通很难很难。 在这一层不光有这些还有Http协议和Servlet,request、response、cookie、session这些也会伴随你整个技术生涯,理解他们对后面的你肯定有不少好处。 Tip:我这里最后删除了JSP相关的技术,我个人觉得没必要学了,很多公司除了老项目之外,新项目都不会使用那些技术了。 前端在我看来比后端难,技术迭代比较快,知识好像也没特定的体系,所以面试大厂的前端很多朋友都说难,不是技术多难,而是知识多且复杂,找不到一个完整的体系,相比之下后端明朗很多,我后面就开始讲后端了。 网关层: 互联网发展到现在,涌现了很多互联网公司,技术更新迭代了很多个版本,从早期的单机时代,到现在超大规模的互联网时代,几亿人参与的春运,几千亿成交规模的双十一,无数互联网前辈的造就了现在互联网的辉煌。 微服务,分布式,负载均衡等我们经常提到的这些名词都是这些技术在场景背后支撑。 单机顶不住,我们就多找点服务器,但是怎么将流量均匀的打到这些服务器上呢? 负载均衡,LVS 我们机器都是IP访问的,那怎么通过我们申请的域名去请求到服务器呢? DNS 大家刷的抖音,B站,快手等等视频服务商,是怎么保证同时为全国的用户提供快速的体验? CDN 我们这么多系统和服务,还有这么多中间件的调度怎么去管理调度等等? zk 这么多的服务器,怎么对外统一访问呢,就可能需要知道反向代理的服务器。 Nginx 这一层做了反向负载、服务路由、服务治理、流量管理、安全隔离、服务容错等等都做了,大家公司的内外网隔离也是这一层做的。 我之前还接触过一些比较有意思的项目,所有对外的接口都是加密的,几十个服务会经过网关解密,找到真的路由再去请求。 这一层的知识点其实也不少,你往后面学会发现分布式事务,分布式锁,还有很多中间件都离不开zk这一层,我们继续往下看。 服务层: 这一层有点东西了,算是整个框架的核心,如果你跟我帅丙一样以后都是从事后端开发的话,我们基本上整个技术生涯,大部分时间都在跟这一层的技术栈打交道了,各种琳琅满目的中间件,计算机基础知识,Linux操作,算法数据结构,架构框架,研发工具等等。 我想在看这个文章的各位,计算机基础肯定都是学过的吧,如果大学的时候没好好学,我觉得还是有必要再看看的。 为什么我们网页能保证安全可靠的传输,你可能会了解到HTTP,TCP协议,什么三次握手,四次挥手。 还有进程、线程、协程,什么内存屏障,指令乱序,分支预测,CPU亲和性等等,在之后的编程生涯,如果你能掌握这些东西,会让你在遇到很多问题的时候瞬间get到点,而不是像个无头苍蝇一样乱撞(然而丙丙还做得不够)。 了解这些计算机知识后,你就需要接触编程语言了,大学的C语言基础会让你学什么语言入门都会快点,我选择了面向对象的JAVA,但是也不知道为啥现在还没对象。 JAVA的基础也一样重要,面向对象(包括类、对象、方法、继承、封装、抽象、 多态、消息解析等),常见API,数据结构,集合框架,设计模式(包括创建型、结构型、行为型),多线程和并发,I/O流,Stream,网络编程你都需要了解。 代码会写了,你就要开始学习一些能帮助你把系统变得更加规范的框架,SSM可以会让你的开发更加便捷,结构层次更加分明。 写代码的时候你会发现你大学用的Eclipse在公司看不到了,你跟大家一样去用了IDEA,第一天这是什么玩意,一周后,真香,但是这玩意收费有点贵,那免费的VSCode真的就是不错的选择了。 代码写的时候你会接触代码的仓库管理工具maven、Gradle,提交代码的时候会去写项目版本管理工具Git。 代码提交之后,发布之后你会发现很多东西需要自己去服务器亲自排查,那Linux的知识点就可以在里面灵活运用了,查看进程,查看文件,各种Vim操作等等。 系统的优化很多地方没优化的空间了,你可能会尝试从算法,或者优化数据结构去优化,你看到了HashMap的源码,想去了解红黑树,然后在算法网上看到了二叉树搜索树和各种常见的算法问题,刷多了,你也能总结出精华所在,什么贪心,分治,动态规划等。 这么多个服务,你发现HTTP请求已经开始有点不满足你的需求了,你想开发更便捷,像访问本地服务一样访问远程服务,所以我们去了解了Dubbo,Spring cloud。 了解Dubbo的过程中,你发现了RPC的精华所在,所以你去接触到了高性能的NIO框架,Netty。 代码写好了,服务也能通信了,但是你发现你的代码链路好长,都耦合在一起了,所以你接触了消息队列,这种异步的处理方式,真香。 他还可以帮你在突发流量的时候用队列做缓冲,但是你发现分布式的情况,事务就不好管理了,你就了解到了分布式事务,什么两段式,三段式,TCC,XA,阿里云的全局事务服务GTS等等。 分布式事务的时候你会想去了解RocketMQ,因为他自带了分布式事务的解决方案,大数据的场景你又看到了Kafka。 我上面提到过zk,像Dubbo、Kafka等中间件都是用它做注册中心的,所以很多技术栈最后都组成了一个知识体系,你先了解了体系中的每一员,你才能把它们联系起来。 服务的交互都从进程内通信变成了远程通信,所以性能必然会受到一些影响。 此外由于很多不确定性的因素,例如网络拥塞、Server 端服务器宕机、挖掘机铲断机房光纤等等,需要许多额外的功能和措施才能保证微服务流畅稳定的工作。 **Spring Cloud **中就有 Hystrix 熔断器、Ribbon客户端负载均衡器、Eureka注册中心等等都是用来解决这些问题的微服务组件。 你感觉学习得差不多了,你发现各大论坛博客出现了一些前沿技术,比如容器化,你可能就会去了解容器化的知识,像**Docker,Kubernetes(K8s)**等。 微服务之所以能够快速发展,很重要的一个原因就是:容器化技术的发展和容器管理系统的成熟。 这一层的东西呢其实远远不止这些的,我不过多赘述,写多了像个劝退师一样,但是大家也不用慌,大部分的技术都是慢慢接触了,工作中慢慢去了解,去深入的。 好啦我们继续沿着图往下看,那再往下是啥呢? 数据层: 数据库可能是整个系统中最值钱的部分了,在我码文字的前一天,刚好发生了微盟程序员删库跑路的操作,删库跑路其实是我们在网上最常用的笑话,没想到还是照进了现实。 这里也提一点点吧,36小时的故障,其实在互联网公司应该是个笑话了吧,权限控制没做好类似rm -rf 、fdisk、drop等等这样的高危命令是可以实时拦截掉的,备份,全量备份,增量备份,延迟备份,异地容灾全部都考虑一下应该也不至于这样,一家上市公司还是有点点不应该。 数据库基本的事务隔离级别,索引,SQL,主被同步,读写分离等都可能是你学的时候要了解到的。 上面我们提到了安全,不要把鸡蛋放一个篮子的道理大家应该都知道,那分库的意义就很明显了,然后你会发现时间久了表的数据大了,就会想到去接触分表,什么TDDL、Sharding-JDBC、DRDS这些插件都会接触到。 你发现流量大的时候,或者热点数据打到数据库还是有点顶不住,压力太大了,那非关系型数据库就进场了,Redis当然是首选,但是MongoDB、memcache也有各自的应用场景。 Redis使用后,真香,真快,但是你会开始担心最开始提到的安全问题,这玩意快是因为在内存中操作,那断点了数据丢了怎么办?你就开始阅读官方文档,了解RDB,AOF这些持久化机制,线上用的时候还会遇到缓存雪崩击穿、穿透等等问题。 单机不满足你就用了,他的集群模式,用了集群可能也担心集群的健康状态,所以就得去了解哨兵,他的主从同步,时间久了Key多了,就得了解内存淘汰机制…… 他的大容量存储有问题,你可能需要去了解Pika…. 其实远远没完,每个的点我都点到为止,但是其实要深究每个点都要学很久,我们接着往下看。 实时/离线/大数据 等你把几种关系型非关系型数据库的知识点,整理清楚后,你会发现数据还是大啊,而且数据的场景越来越多多样化了,那大数据的各种中间件你就得了解了。 你会发现很多场景,不需要实时的数据,比如你查你的支付宝去年的,上个月的账单,这些都是不会变化的数据,没必要实时,那你可能会接触像ODPS这样的中间件去做数据的离线分析。 然后你可能会接触Hadoop系列相关的东西,比如于Hadoop(HDFS)的一个数据仓库工具Hive,是建立在 Hadoop 文件系统之上的分布式面向列的数据库HBase 。 写多的场景,适合做一些简单查询,用他们又有点大材小用,那Cassandra就再合适不过了。 离线的数据分析没办法满足一些实时的常见,类似风控,那Flink你也得略知一二,他的窗口思想还是很有意思。 数据接触完了,计算引擎Spark你是不是也不能放过…… 搜索引擎: 传统关系型数据库和NoSQL非关系型数据都没办法解决一些问题,比如我们在百度,淘宝搜索东西的时候,往往都是几个关键字在一起一起搜索东西的,在数据库除非把几次的结果做交集,不然很难去实现。 那全文检索引擎就诞生了,解决了搜索的问题,你得思考怎么把数据库的东西实时同步到ES中去,那你可能会思考到logstash去定时跑脚本同步,又或者去接触伪装成一台MySQL从服务的Canal,他会去订阅MySQL主服务的binlog,然后自己解析了去操作Es中的数据。 这些都搞定了,那可视化的后台查询又怎么解决呢?Kibana,他他是一个可视化的平台,甚至对Es集群的健康管理都做了可视化,很多公司的日志查询系统都是用它做的。 学习路线 看了这么久你是不是发现,帅丙只是一直在介绍每个层级的技术栈,并没说到具体的一个路线,那是因为我想让大家先有个认知或者说是扫盲吧,我一样用脑图的方式汇总一下吧,如果图片被平台二压了。 资料/学习网站 Tip:本来这一栏有很多我准备的资料的,但是都是外链,或者不合适的分享方式,博客的运营小姐姐提醒了我,所以大家去公众号回复【路线】好了。 絮叨 如果你想去一家不错的公司,但是目前的硬实力又不到,我觉得还是有必要去努力一下的,技术能力的高低能决定你走多远,平台的高低,能决定你的高度。 如果你通过努力成功进入到了心仪的公司,一定不要懈怠放松,职场成长和新技术学习一样,不进则退。 丙丙发现在工作中发现我身边的人真的就是实力越强的越努力,最高级的自律,享受孤独(周末的歪哥)。 总结 我提到的技术栈你想全部了解,我觉得初步了解可能几个月就够了,这里的了解仅限于你知道它,知道他是干嘛的,知道怎么去使用它,并不是说深入了解他的底层原理,了解他的常见问题,熟悉问题的解决方案等等。 你想做到后者,基本上只能靠时间上的日积月累,或者不断的去尝试积累经验,也没什么速成的东西,欲速则不达大家也是知道的。 技术这条路,说实话很枯燥,很辛苦,但是待遇也会高于其他一些基础岗位。 所实话我大学学这个就是为了兴趣,我从小对电子,对计算机都比较热爱,但是现在打磨得,现在就是为了钱吧,是不是很现实?若家境殷实,谁愿颠沛流离。 但是至少丙丙因为做软件,改变了家庭的窘境,自己日子也向小康一步步迈过去。 说做程序员改变了我和我家人的一生可能夸张了,但是我总有一种下班辈子会因为我选择走这条路而改变的错觉。 我是敖丙,一个在互联网苟且偷生的工具人。 创作不易,本期硬核,不想被白嫖,各位的「三连」就是丙丙创作的最大动力,我们下次见! 本文 GitHub https://github.com/JavaFamily 已经收录,有大厂面试完整考点,欢迎Star。 该回答来自:敖丙

剑曼红尘 2020-03-06 11:35:37 0 浏览量 回答数 0

问题

SSH面试题

琴瑟 2019-12-01 21:46:22 3489 浏览量 回答数 0

问题

干货分享:DBA专家门诊一期:索引与sql优化问题汇总

xiaofanqie 2019-12-01 21:24:21 74007 浏览量 回答数 38

回答

回2楼啊里新人的帖子 在日常的业务开发中,常见使用到索引的地方大概有两类: 第一类.做业务约束需求,比如需要保证表中每行的单个字段或者某几个组合字段是唯一的,则可以在表中创建唯一索引; 比如:需要保证test表中插入user_id字段的值不能出现重复,则在设计表的时候,就可以在表中user_id字段上创建一个唯一索引: CREATE TABLE `test` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `user_id` int(11) NOT NULL,   `gmt_create` datetime DEFAULT NULL,   PRIMARY KEY (`id`),   UNIQUE KEY `uk_userid` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; 第二类.提高SQL语句执行速度,可以根据SQL语句的查询条件在表中创建合适的索引,以此来提升SQL语句的执行速度; 此过程好比是去图书找一本书,最慢的方法就是从图书馆的每一层楼每一个书架一本本的找过去;快捷一点的方法就是先通过图书检索来确认这一本书在几楼那个书架上,然后直接去找就可以了;当然创建这个索引也需要有一定的代价,需要存储空间来存放,需要在数据行插入,更新,删除的时候维护索引: 例如: CREATE TABLE `test_record` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `user_id` int(11) NOT NULL,   `gmt_create` datetime DEFAULT NULL,   PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5635996 DEFAULT CHARSET=utf8 该表有500w的记录,我需要查询20:00后插入的记录有多少条记录: mysql> select count(*) from test_record where gmt_create>'2014-12-17 20:00:00'; +----------+ | count(*) | +----------+ |        1 | +----------+ 1 row in set (1.31 sec) 可以看到查询耗费了1.31秒返回了1行记录,如果我们在gmt_create字段上添加索引: mysql> alter table test_record add index ind_gmt_create(gmt_create); Query OK, 0 rows affected (21.87 sec) Records: 0  Duplicates: 0  Warnings: 0 mysql> select count(*) from test_record where gmt_create>'2014-12-17 20:00:00'; +----------+ | count(*) | +----------+ |        1 | +----------+ 1 row in set (0.01 sec) 查询只消耗了0.01秒中就返回了记录. 总的来说,为SQL语句(select,update,delete)创建必要的索引是必须的,这样虽然有一定的性能和空间消耗,但是是值得,尤其是在大并发的请求下,大量的数据被扫描造成系统IO和CPU资源消耗完,进而导致整个数据库不可服务. ------------------------- 怎么学好数据库是一个比较大题目,数据库不仅仅是写SQL那么简单,即使知道了SQL怎么写,还需要很清楚的知道这条SQL他大概扫描了多少数据,返回多少数据,是否需要创建索引。至于SQL优化是一个比较专业的技术活,但是可以通过学习是可以掌握的,你可以把一条sql从执行不出来优化到瞬间完成执行,这个过程的成就感是信心满满的。学习的方法可以有以下一些过程:1、自己查资料,包括书本,在线文档,google,别人的总结等等,试图自己解决2、多做实验,证明自己的想法以及判断3、如果实在不行,再去论坛问,或者问朋友4、如果问题解决了,把该问题的整个解决方法记录下来,以备后来的需要5、多关注别人的问题,或许以后自己就遇到了,并总是试图去多帮助别人6、习惯从多个方面去考虑问题,并且养成良好的总结习惯 下面是一些国内顶级数据库专家学习数据库的经验分享给大家: http://www.eygle.com/archives/2005/08/ecinieoracleouo.html 其实学习任何东西都是一样,没有太多的捷径可走,必须打好了坚实的基础,才有可以在进一步学习中得到快速提高。王国维在他的《人间词话》中曾经概括了为学的三种境界,我在这里套用一下: 古今之成大事业、大学问者,罔不经过三种之境界。"昨夜西风凋碧树。独上高楼,望尽天涯路。"此第一境界也。"衣带渐宽终不悔,为伊消得人憔悴。"此第二境界也。"众里寻他千百度,蓦然回首,那人却在灯火阑珊处。"此第三境界也。 学习Oracle,这也是你必须经历的三种境界。 第一层境界是说,学习的路是漫漫的,你必须做好充分的思想准备,如果半途而废还不如不要开始。 这里,注意一个"尽"字,在开始学习的过程中,你必须充分阅读Oracle的基础文档,概念手册、管理手册、备份恢复手册等(这些你都可以在http://tahiti.oracle.com 上找到);OCP认证的教材也值得仔细阅读。打好基础之后你才具备了进一步提升的能力,万丈高楼都是由地而起。 第二层境界是说,尽管经历挫折、打击、灰心、沮丧,也都要坚持不放弃,具备了基础知识之后,你可以对自己感兴趣或者工作中遇到的问题进行深入的思考,由浅入深从来都不是轻而易举的,甚至很多时候你会感到自己停滞不前了,但是不要动摇,学习及理解上的突破也需要时间。 第三次境界是说,经历了那么多努力以后,你会发现,那苦苦思考的问题,那百思不得其解的算法原理,原来答案就在手边,你的思路豁然开朗,宛如拨云见月。这个时候,学习对你来说,不再是个难题,也许是种享受,也许成为艺术。 所以如果你想问我如何速成,那我是没有答案的。 不经一番寒彻骨,哪得梅花扑鼻香。 当然这三种境界在实际中也许是交叉的,在不断的学习中,不断有蓦然回首的收获。 我自己在学习的过程中,经常是采用"由点及面法"。 当遇到一个问题后,一定是深入下去,穷究根本,这样你会发现,一个简单的问题也必定会带起一大片的知识点,如果你能对很多问题进行深入思考和研究,那么在深处,你会发现,这些面逐渐接合,慢慢的延伸到oracle的所有层面,逐渐的你就能融会贯通。这时候,你会主动的去尝试全面学习Oracle,扫除你的知识盲点,学习已经成为一种需要。 由实践触发的学习才最有针对性,才更能让你深入的理解书本上的知识,正所谓:" 纸上得来终觉浅,绝知此事要躬行"。实践的经验于我们是至为宝贵的。 如果说有,那么这,就是我的捷径。 想想自己,经常是"每有所获,便欣然忘食", 兴趣才是我们最好的老师。 Oracle的优化是一门学问,也是一门艺术,理解透彻了,你会知道,优化不过是在各种条件之下做出的均衡与折中。 内存、外存;CPU、IO...对这一切你都需要有充分的认识和相当的了解,管理数据库所需要的知识并不单纯。 作为一个数据库管理人员,你需要做的就是能够根据自己的知识以及经验在各种复杂情况下做出快速正确的判断。当问题出现时,你需要知道使用怎样的手段发现问题的根本;找到问题之后,你需要运用你的知识找到解决问题的方法。 这当然并不容易,举重若轻还是举轻若重,取决于你具备怎样的基础以及经验积累。 在网络上,Howard J. Rogers最近创造了一个新词组:Voodoo Tuning,用以形容那些没有及时更新自己的知识技能的所谓的Oracle技术专家。由于知识的陈旧或者理解的肤浅,他们提供的很多调整建议是错误的、容易使人误解的,甚至是荒诞的。他们提供的某些建议在有些情况下也许是正确的,如果你愿意回到Oracle5版或者6版的年代;但是这些建议在Oracle7.0,8.0 或者 Oracle8i以后往往是完全错误的。 后来基于类似问题触发了互联网内Oracle顶级高手的一系列深入讨论,TOM、Jonathan Lewis、HJR等人都参与其中,在我的网站上(www.eygle.com )上对这些内容及相关链接作了简要介绍,有兴趣的可以参考。 HJR给我们提了很好的一个提示:对你所需要调整的内容,你必须具有充分的认识,否则你做出的判断就有可能是错误的。 这也是我想给自己和大家的一个建议: 学习和研究Oracle,严谨和认真必不可少。 当然 你还需要勤奋,我所熟悉的在Oracle领域有所成就的技术人员,他们共同的特点就是勤奋。 如果你觉得掌握的东西没有别人多,那么也许就是因为,你不如别人勤奋。 要是你觉得这一切过于复杂了,那我还有一句简单的话送给大家: 不积跬步,无以至千里。学习正是在逐渐积累过程中的提高。 现在Itpub给我们提供了很好的交流场所,很多问题都可以在这里找到答案,互相讨论,互相学习。这是我们的幸运,我也因此非常感谢这个网络时代。 参考书籍: 如果是一个新人可以先买一些基本的入门书籍,比如MySQL:《 深入浅出MySQL——数据库开发、优化与管理维护 》,在进阶一点的就是《 高性能MySQL(第3版) 》 oracle的参考书籍: http://www.eygle.com/archives/2006/08/oracle_fundbook_recommand.html 最后建议不要在数据库中使用外键,让应用程序来保证。 ------------------------- Re:回 9楼(千鸟) 的帖子 我有一个问题想问问,现在在做一个与图书有关的项目,其中有一个功能是按图书书名搜索相似图书列表,问题不难,但是想优化一下,有如下问题想请教一下: 1、在图书数据库数据表的书名字段里,按图书书名进行关键字搜索,如何快速搜索相关的图书?   现在由于数据不多,直接用的like模糊查找验证功能而已; 如果数据量不大,是可以在数据库中完成搜索的,可以在搜索字段上创建索引,然后进行搜索查询: CREATE TABLE `book` (   `book_id` int(11) NOT NULL AUTO_INCREMENT,   `book_name` varchar(100) NOT NULL,   .............................   PRIMARY KEY (`book_id`),   KEY `ind_name` (`book_name`) ) ENGINE=InnoDB select book.*  from book , (select book_id from book where book_name like '%算法%')  book_search_id  where book.book_id=book_search_id.book_id; 但是当数据量变得很大后,就不在适合了,可以采用一些其他的第三方搜索技术比如sphinx; 2、如何按匹配的关键度进行快速排序?比如搜索“算法”,有一本书是《算法》,另一本书是《算法设计》,要求前者排在更前面。 现在的排序是根据数据表中的主键序号id进行的排序,没有达到想要的效果。 root@127.0.0.1 : test 15:57:12> select book_id,book_name from book_search where book_name like '%算%' order by book_name; +---------+--------------+ | book_id | book_name    | +---------+--------------+ |       2 | 算法       | |       1 | 算法设计 | ------------------------- 回 10楼(大黑豆) 的帖子 模糊查询分为半模糊和全模糊,也就是: select * from book where name like 'xxx%';(半模糊) select * from book where name like '%xxx%';(全模糊) 半模糊可以可以使用到索引,全模糊在上面场景是不能使用到索引的,但可以进行一些改进,比如: select book.*  from book , (select book_id from book where book_name like '%算法%')  book_search_id   where book.book_id=book_search_id.book_id; 注意这里book_id是主键,同时在book_name上创建了索引 上面的sql语句可以利用全索引扫描来完成优化,但是性能不会太好;特别在数据量大,请求频繁的业务场景下不要在数据库进行模糊查询; 非得使用数据库的话 ,建议不要在生产库进行查询,可以在只读节点进行查询,避免查询造成主业务数据库的资源消耗完,导致故障. 可以使用一些开源的搜索引擎技术,比如sphinx. ------------------------- 回 11楼(蓝色之鹰) 的帖子 我想问下,sql优化一般从那几个方面入手?多表之间的连接方式:Nested Loops,Hash Join 和 Sort Merge Join,是不是Hash Join最优连接? SQL优化需要了解优化器原理,索引的原理,表的存储结构,执行计划等,可以买一本书来系统的进行学习,多多实验; 不同的数据库优化器的模型不一样,比如oracle支持NL,HJ,SMJ,但是mysql只支持NL,不通的连接方式适用于不同的应用场景; NL:对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择 HJ:对于列连接是做大数据集连接时的常用方式 SMJ:通常情况下散列连接的效果都比排序合并连接要好,然而如果行源已经被排过序,在执行排序合并连接时不需要再排序了,这时排序合并连接的性能会优于散列连接 ------------------------- Re:回 19楼(原远) 的帖子 有个问题:分类表TQueCategory,问题表TQuestion(T-SQL) CREATE TABLE TQueCategory ( ID INT IDENTITY(1,1) PRIMARY KEY,        --问题分类ID NAME VARCHAR(20)        --问题分类名称 ) CREATE TABLE TQuestion ( ID INT IDENTITY(1,1) PRIMARY KEY,        --问题ID CateID INT NOT NULL,        --问题分类ID TITLE VARCHAR(50),        --问题标题 CONTENT VARCHAR(500)        --问题内容 ) 当前要统计某个分类下的问题数,有两种方式: 1.每次统计,在TQuestion通过CateID进行分组统计 SELECT CateID,COUNT(1) AS QueNum FROM TQuestion GROUP BY CateID WHERE 1=1 2.在TQueCategory表增加字段QueNum,用于标识该分类下的问题数量 ALTER TABLE TQueCategory ADD QueNum INT SELECT CateID,QueNum FROM TQueCategory 问:在哪种业务应用场景下采用上面哪种方式性能比较好,为什么? ############################################################################################### 方案 一 需要对 TQuestion 的 CateID字段 进行分组 ,可以在 CateID上创建一个索引,这样就可以索引扫描来完成查询; 方案 二 需要对 TQueCategory 进行扫描就可以得出结果,但是必须在问题表有插入,删除的时候维护quenum数量; 单单从SQL的性能来看, 分类表的数量应该是远远小于问题表的数量的,所以方案二的性能会比较好; 但是如果 TQuestion 的插入非常频繁的话,会带来对 TQueCategory的频繁更新,一次 TQuestion 的 insert或deleted就会带来一次 TQueCategory 的update,这个代价其实是蛮高的; 如果这个分类统计的查询不是非常频繁的话,建议还是使用方案一; 同时还可能还会其他的业务逻辑统计需求(例如: CateID +时间),这个时候在把逻辑放到 TQueCategory就不合适了。 ------------------------- 回 20楼(原远) 的帖子 经验之谈,仅供参考 使用外键在开发上确实省去了很多功夫,但是把业务逻辑交由数据库来完成,对后期的维护来说是很麻烦的事情,不利于维护. ------------------------- 回 21楼(玩站网) 的帖子 无关技术方面: 咨询一下,现在mysql新的版本,5.5.45后貌似修改了开源协议。 是否意味着今后我们商业化使用mysql将受到限制? 如果甲骨文真周到那一步,rds是否会受到影响? 一个疑惑: 为什么很少见到有人用mysql正则匹配?性能不好还是什么原因? ######################################## MySQL有商业版 和 社区版,RDS的MySQL采用开源的社区版进行改进,由专门的RDS MySQL源码团队来维护,国内TOP 10的mysql源码贡献者大部分都在RDS,包括了@丁奇 ,@彭立勋 ,@印风 等; 不在数据库中做业务计算,是保证数据库运行稳定的一个好的设计经验; 是否影响性能与你的sql的执行频率,需要参与的计算数据量相关,当然了还包括数据库所在主机的IO,cpu,内存等资源,离开了这些谈性能是没有多大意义的; ------------------------- 回 22楼(比哥) 的帖子 分页该怎么优化才行??? ######################### 可以参考这个链接,里面有很多的最佳实践,其中就包括了分页语句的优化: http://bbs.aliyun.com/read/168647.html?spm=5176.7114037.1996646101.1.celwA1&pos=1 普通写法: select  *  from t where sellerid=100 limit 100000,20 普通limit M,N的翻页写法,往往在越往后翻页的过程中速度越慢,原因 mysql会读取表中的前M+N条数据,M越大,性能就越差: 优化写法: select t1.* from  t t1,             (select id from t  sellerid=100 limit 100000,20) t2 where t1.id=t2.id; 优化后的翻页写法,先查询翻页中需要的N条数据的主键id,在根据主键id 回表查询所需要的N条数据,此过程中查询N条数据的主键ID在索引中完成 注意:需要在t表的sellerid字段上创建索引 create index ind_sellerid on t(sellerid); 案例: user_A (21:42:31): 这个sql该怎么优化,执行非常的慢: | Query   |   51 | Sending data | select id, ... from t_buyer where sellerId = 765922982 and gmt_modified >= '1970-01-01 08:00:00' and gmt_modified <= '2013-06-05 17:11:31' limit 255000, 5000 SQL改写:selectt2.* from (selectid from t_buyer where sellerId = 765922982   andgmt_modified >= '1970-01-01 08:00:00'   andgmt_modified <= '2013-06-05 17:11:31' limit255000, 5000)t1,t_buyer t2 where t1.id=t2.id index:seller_id,gmt_modified user_A(21:58:43): 好像很快啊。神奇,这个原理是啥啊。牛!!! user_A(21:59:55): 5000 rows in set (4.25 sec), 前面要90秒。 ------------------------- 回 27楼(板砖大叔) 的帖子 这里所说的索引都是普通的b-tree索引,mysql,sqlserver,oracle 的关系数据库都是默认支持的; ------------------------- 回 32楼(veeeye) 的帖子 可以详细说明一下“最后建议不要在数据库中使用外键,让应用程序来保证。 ”的原因吗?我们公司在项目中经常使用外键,用程序来保证不是相对而言更加复杂了吗? 这里的不建议使用外键,主要考虑到 : 第一.维护成本上,把一些业务逻辑交由数据库来保证,当业务需求发生改动的时候,需要同时考虑应用程序和数据库,有时候一些数据库变更或者bug,可能会导致外键的失效;同时也给数据库的管理人员带来维护的麻烦,不便于管理。 第二.性能上考虑,当大量数据写入的时候,外键肯定会带来一定的性能损耗,当出现这样的问题时候,再来改造去除外键,真的就不值得了; 最后,不在数据库中参与业务的计算(存储过程,函数,触发器,外键),是保证数据库运行稳定的一个好的最佳实践。 ------------------------- 回 33楼(优雅的固执) 的帖子 ReDBA专家门诊一期:索引与sql优化 十分想请大师分享下建立索引的经验 我平时简历索引是这样的 比如订单信息的话 建立 订单号  唯一聚集索引 其他的比如   客户编号 供应商编号 商品编号 这些建立非聚集不唯一索引   ################################################## 建立索引,需要根据你的SQL语句来进行创建,不是每一个字段都需要进行创建,也不是一个索引都不创建,,可以把你的SQL语句,应用场景发出来看看。 索引的创建确实是一个非常专业的技术活,需要掌握:表的存储方式,索引的原理,数据库的优化器,统计信息,最后还需要能够读懂数据库的执行计划,以此来判断索引是否创建正确; 所以需要进行系统的学习才能掌握,附件是我在2011年的时候的一次公开课的ppt,希望对你有帮助,同时可以把你平时遇到的索引创建的疑惑发到论坛上来,大家可以一起交流。 ------------------------- 回 30楼(几几届) 的帖子 我也是这样,简单的会,仔细写也会写出来,但是就是不知道有没有更快或者更好的 #################################################### 多写写SQL,掌握SQL优化的方法,自然这些问题不在话下了。 ------------------------- 回 40楼(小林阿小林) 的帖子 mysql如何查询需要优化的语句,比如慢查询的步奏,如何找出需要通知程序员修改或者优化的sql语句 ############################################################ 可以将mysql的慢日志打开,就可以记录执行时间超过指定阀值的慢SQL到本地文件或者数据库的slow_log表中; 在RDS中默认是打开了慢日志功能的:long_query_time=1,表示会记录执行时间>=1秒的慢sql; 如何快速找到mysql瓶颈: 简单一点的方法,可以通过监控mysql所在主机的性能(CPU,IO,load等)以及mysql本身的一些状态值(connections,thread running,qps,命中率等); RDS提供了完善的数据库监控体系,包括了CPU,IOPS,Disk,Connections,QPS,可以重点关注cpu,IO,connections,disk 4个 指标; cpu,io,connections主要体现在了性能瓶颈,disk主要体现了空间瓶颈; 有时候一条慢sql语句的频繁调用,也可能导致整个实例的cpu,io,connections达到100%;也有可能一条排序的sql语句,消耗大量的临时空间,导致实例的空间消耗完。 ------------------------- 下面是分析一个cpu 100%的案例分析:该实例的cpu已经到达100% 查看当前数据库的活动会话信息:当前数据库有较多的活跃线程在数据库中执行查看当前数据库正在执行的sql: 可以看到这条sql执行的非常缓慢:[tr=rgb(100, 204, 255)]delete from task_process where task_id='1801099' 查看这个表的索引: CREATE TABLE `task_process` (  `id` int(11) NOT NULL AUTO_INCREMENT,    ................  `task_id` int(11) NOT NULL DEFAULT '0' COMMENT '??????id',   ................  PRIMARY KEY (`id`),  KEY `index_over_task` (`is_over`,`task_id`),  KEY `index_over` (`is_over`,`is_auto`) USING BTREE,  KEY `index_process_sn` (`process_sn`,`is_over`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=32129710; 可以看到这个表有3KW的数据,但是没有task_id字段开头的索引,导致该sql语句删除需要进行全表扫描: 在我们的诊断报告中已经将该sql语句捕获到,同时给你提出该怎样进行索引的添加。 广告:诊断报告将会在1月底发布到控制台,到时候用户可以直接查看诊断建议,来完成你的数据库优化。 ------------------------- 回 45楼(dentrite) 的帖子 datetime和int都是占用数据库4个字节,所以在空间上没有什么差别;但是为了可读性,建议还是使用datetime数据类型。 ------------------------- 回 48楼(yuantel) 的帖子 麻烦把ecs_brand和ecs_goods的表结构发出来一下看看 。 ------------------------- 回 51楼(小林阿小林) 的帖子 普通的 ECS服务器上目前还没有这样的慢SQL索引建议的工具。 不过后续有IDBCloud将会集成这样的sql诊断功能,使用他来管理ECS上的数据库就可以使用这样的功能了 。

玄惭 2019-12-02 01:16:11 0 浏览量 回答数 0

问题

程序员报错QA大分享(1)

问问小秘 2020-06-18 15:46:14 8 浏览量 回答数 1
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 企业建站模板