合景誉山国际域名寻求合作

Jonee 发表于 个人日志 分类, 被浏览: 87 次
0

hjysgj.com

寻求合作或者出售都可以,可以做成社区门户网站形式

QQ:点击这里给我发消息

邮箱:mail to me

mysql orderby limit 翻页数据重复的问题

Jonee 发表于 Linux 分类, 被浏览: 146 次
0

在mysql中我们通常会采用limit来进行翻页查询,比如limit(0,10)表示列出第一页的10条数据,limit(10,10)表示列出第二页。但是,当limit遇到order by的时候,可能会出现翻到第二页的时候,竟然又出现了第一页的记录。

具体如下:

SELECT `post_title`,`post_date` FROM post WHERE `post_status`='publish' ORDER BY view_count desc LIMIT 5,5

使用上述SQL查询的时候,很有可能出现和LIMIT 0,5相同的某条记录,而如果使用:

SELECT `post_title`,`post_date` FROM post WHERE `post_status`='publish' ORDER BY view_count desc,ID asc LIMIT 5,5

则不会出现重复的情况。但是,由于post表的字段很多,我仅仅希望用这两个字段,不想把post_content也查出来。为了解决这个情况,我在ORDER BY后面使用了两个排序条件来解决这个问题。

SELECT `post_title`,`post_date` FROM post WHERE `post_status`='publish' ORDER BY view_count desc,ID asc LIMIT 5,5

按理来说,mysql的排序默认情况下是以主键ID作为排序条件的,也就是说,如果在view_count相等的情况下,主键ID作为默认的排序条件,不需要我们多此一举加ID asc。但是事实就是,mysql再order by和limit混用的时候,出现了排序的混乱情况。其后的机理我尚不得而知,在阅读这篇文章后,好像有所领悟,下面做一下猜测。

这篇文章的解释是:

在MySQL 5.6的版本上,优化器在遇到order by limit语句的时候,做了一个优化,即使用了priority queue。……

使用 priority queue 的目的,就是在不能使用索引有序性的时候,如果要排序,并且使用了limit
n,那么只需要在排序的过程中,保留n条记录即可,这样虽然不能解决所有记录都需要排序的开销,但是只需要 sort buffer
少量的内存就可以完成排序。

之所以5.6出现了第二页数据重复的问题,是因为 priority queue
使用了堆排序的排序方法,而堆排序是一个不稳定的排序方法,也就是相同的值可能排序出来的结果和读出来的数据顺序不一致。

5.5 没有这个优化,所以也就不会出现这个问题。

也就是说,mysql5.5是不存在本文提到的问题的,5.6版本之后才出现了这种情况。

我们再看下mysql解释sql语言时的执行顺序:

(7)     SELECT 
(8)     DISTINCT <select_list>
(1)     FROM <left_table>
(3)     <join_type> JOIN <right_table>
(2)     ON <join_condition>
(4)     WHERE <where_condition>
(5)     GROUP BY <group_by_list>
(6)     HAVING <having_condition>
(9)     ORDER BY <order_by_condition>
(10)    LIMIT <limit_number>

在我们本文的案例sql中,执行顺序依次为form… where… select… order by… limit…

由于上述priority queue的原因,在完成select之后,所有记录是以堆排序的方法排列的,在进行order by时,仅把view_count值大的往前移动。但由于limit的因素,排序过程中只需要保留到5条记录即可,view_count并不具备索引有序性,所以当第二页数据要展示时,mysql见到哪一条就拿哪一条,因此,当排序值相同的时候,第一次排序是随意排的,第二次再执行该sql的时候,其结果应该和第一次结果一样。

这只是我的猜测,有理解的朋友,请帮忙解答。

epoll 误区

Jonee 发表于 Linux, 个人日志 分类, 被浏览: 1220 次
0

对于epoll的网上一大抄的太多,而其中对ET模式的描述基本都是不准确的

以下是被抄袭最多的部分,而对于ET的误区就在这里

EPOLL事件分发系统可以运转在两种模式下:Edge Triggered (ET)、Level Triggered (LT)。
LT是缺省的工作方式,并且同时支持block和no-block socket;在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你 的,所以,这种模式编程出错误可能性要小一点。传统的select/poll都是这种模型的代表。

ET是高速工作方式,只支持no-block socket。在这种模式下,当描述符从未就绪变为就绪时,内核通过epoll告诉你。然后它会假设你知道文件描述符已经就绪,并且不会再为那个文件描述 符发送更多的就绪通知,直到你做了某些操作导致那个文件描述符不再为就绪状态了。但是请注意,如果一直不对这个fd作IO操作(从而导致它再次变成未就 绪),内核不会发送更多的通知。

按照以上描述ET模式下,比如EPOLLIN事件到达,如果你不recv直到返回错误,那么之后有数据到达,系统不会再通知你。但事实上并不是这样,某些时候系统还是会通知你的,下面对Epoll事件触发时机做个总结

阅读全文 »

增强ctags对lua的支持

Jonee 发表于 Linux 分类, 被浏览: 2306 次
0

最近用vim写lua代码,发现由于ctags对lua支持不友好, 很多lua的符号都不能跳转 表现在
1) ctags默认对lua的支持仅限于识别function, 不支持识别常量定义.
2) 如果通过CLASS:MEMBER_FUN(…)方式以及CLASS.MEMBER_FUN()方式定义的function, 所生成的tags是如下形式:
CLASS:MEMBER_FUN …省略
CLASS.MEMBER_FUN …省略
这样的tags文件无法直接通过MEMBER_FUN跳转过去. , 比如:通过:tselect MEMBER_FUN也无法找到对应的tag,
除非通过tselect /^.*MEMBER_FUN来找, 但是通过正则效率又太低. 而且会找到很多无关的匹配项.

所以, 本文研究了通过其他手段来生成lua的tags. 主要需要解决两个问题,
1) 支持能对lua中定义的常量/变量生成tags. 为了放置太多变量被索引, 限制变量的值必须是数字. 因为几乎所有的枚举值/常量的值都是数字.
2) 生成的tags去掉类名前缀, 比如:”CLASS:”以及”CLASS.”前缀, 以便通过MEMBER_FUN能够直接跳转过去.
阅读全文 »

联想官方win7 OEM 32/64系统

Jonee 发表于 操作系统, 网络转载 分类, 被浏览: 3141 次
0

联想官方win7 OEM 32/64系统 – win7系统下载 – 系统爱好者

联想官方win7 OEM 32/64系统,知识库里面的官方系统,绝对有保障,我就不多介绍了,关于联想知识库系统系统下载方法大家都知道吧,不要复制到地址栏打开,直接复制到迅雷就能下载

 
阅读全文 »