Recently in MySQL Category

高效提高分页效率的方法

|
分页是数据库系统中,尤其是网页中常见的功能。数量级在一万以下时,分页的性能问题觉察不出来;当在数量在一万到100万之间时,有点担心性能问题;当数量过百万时,分页性能是必须考虑的问题了。 传统方案: 索引 索引可以明显提高索引性能,自然索引可以提高分页性能。但是即使一个简单的表,每页10条,当查看1000页时,估计性能已经不能让人满意了。如何优化? /********************** 补充一点: 当你的查询是比较复杂时,索引是不是恰当也是值得注意的地方。如果你知道联合索引是怎么回事,什么地方使用,那么你可以略过此段。以下面的SQL为例: SELECT * FROM TABLEA WHERE F1 = 'value' AND F2 = 'value' 如果只是针对F1, F2单独建了索引,而没有建联合索引,则当分别符合F1, F2条件的两个记录集中数量最小某的仍然很大时,速度就不理想了。这是因为使用F1索引,但是F2的索引没有用上劲;或者,反之。如果优化索引呢,得建(F1,F2)的联合索引,这样上面的SQL语句就很快了。 ***********************/ 一点小技巧: 使用联合索引后,前几百页很快了。但是越往后,速度越慢;现在咱们使用一个技巧,最后几页,肯定是使用倒序的第一页,以此类推。  这样,分页的最后和最后都很快了。也许各位要较真了,正序和倒序的重合部分怎么办?几条记录即出现在第N页上,又出现在N+1页上,怎么办?其实这个问题不大,想一想,这个技巧只有当页码超过某个数量级之后才会应用。那时,已经无人会注意这些细节了。 大大的技巧: 联合索引可以极大提高搜索速度,能不能把分页转换成条件检索呢,换句话说,SQL始终在执行某一条件的LIMIT 10。当然可以了,我们分页时基本上按照自动编号的ID进行排序(一定意义上等同于按照时间排序)。如果每次翻页时,把当前页的最后一个ID传过去,构建SQL语句时,除了应用之前的检索条件,再加上ID范围限制,这样下一页呈现时,只需要搜索前几条就可以了。SQL语句部分不存在分页的问题了。比如构建后的SQL可能是这样的: SELECT * FROM TABLEA WHERE F1 = 'value' AND F2...

ERROR 1418 (HY000) log_bin_trust_function_creators 解决

|
今天要写一个函数.但没有办法建提示错误如下: mysql> CREATE FUNCTION hello (s CHAR(20)) RETURNS CHAR(50)    -> RETURN CONCAT('Hello, ',s,'!');    -> //ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might*...