mysql随机:MYSQL的随机抽取实现方法及效率(转载)

mysql随机:MYSQL的随机抽取实现方法及效率(转载)_啥也没有.

最近由于需要大概研究了一下MYSQL的随机抽取实现方法。举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。

但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。但是在MYSQL 3.23版本中,仍然可以通过ORDER BY RAND()来实现随机。

但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上。查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效率及很低。
You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.
搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。
SELECT *
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id ASC LIMIT 5;

但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。

下面的语句采用的是JOIN,mysql的论坛上有人使用
SELECT *
FROM `table`
WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )
ORDER BY id LIMIT 1;

我测试了一下,需要0.5秒,速度也不错,但是跟上面的语句还是有很大差距。总觉有什么地方不正常。

于是我把语句改写了一下。
SELECT * FROM `table`
WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))
ORDER BY id LIMIT 1;

这下,效率又提高了,查询时间只有0.01秒

最后,再把语句完善一下,加上MIN(id)的判断。我在最开始测试的时候,就是因为没有加上MIN(id)的判断,结果有一半的时间总是查询到表中的前面几行。
完整查询语句是:
SELECT * FROM `table`
WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)))
ORDER BY id LIMIT 1;

SELECT *
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT 1;

最后在php中对这两个语句进行分别查询10次,
前者花费时间 0.147433 秒
后者花费时间 0.015130 秒
看来采用JOIN的语法比直接在WHERE中使用函数效率还要高很多。

Posted in php. 标签:, , . No Comments »

PHP字符截取函数

<?php
function sysSubStr($String,$Length,$Append = false)
{
if (strlen($String) < = $Length )
{
       return $String;
}
else
{
       $I = 0;
       while ($I < $Length)
       {
         $StringTMP = substr($String,$I,1);
         if ( ord($StringTMP) >=224 )
         {
            $StringTMP = substr($String,$I,3);
            $I = $I + 3;
         }
         elseif( ord($StringTMP) >=192 )
         {
            $StringTMP = substr($String,$I,2);
            $I = $I + 2;
         }
         else
         {
            $I = $I + 1;
         }
         $StringLast[] = $StringTMP;
       }
       $StringLast = implode("",$StringLast);
       if($Append)
       {
         $StringLast .= "...";
       }
       return $StringLast;
}
}
$String = "whatever you want";
$Length = "10";
$Append = false;
echo sysSubStr($String,$Length,$Append);
?>

Posted in php. 标签:, . No Comments »

PHP学习笔记(一)——基本语法

1.PHP中的文件包含

PHP中的文件包含有两种方法:使用include()函数和使用require()函数。函数里面是所要包含进来的文件的名称。

Include()函数可以放在程序的任何地方,PHP编译器在读到include()函数时,才将指定文件包含进来。而require()函数必须要放在PHP程序的最前面,PHP程序在执行时,先读入require()函数所包含的文件,使它成为PHP网页的一部分。常用的函数一般都是用 require的方法包含进来的。

2.PHP中预定义的常量

常量名称

常量含义

__FILE__

当前PHP程序文件名。在include()或require()函数中使用这个常量能得到该函数包含的文件名

__LINE__

当前执行语句在PHP程序文件中的行数。在include()或require()函数中这个常量将表示被引用文件的行数

PHP_VERSION

当前PHP程序的版本号

PHP_OS

当前所用操作系统类别

True

逻辑真

False

逻辑假

E_ERROR

指明最近一次产生的不可恢复的错误

E_WARING

指出有错误,但程序可以继续进行下去,该错误可被脚本捕获

E_PARSE

语法错误,分析器将停止分析

E_NOTICE

产生异常,但不一定是错误,程序可以继续执行

说明:__FILE__和__LINE__中的“__”是双下划线,不是单下划线。以“E_”开头的常量一般与error_reporting()函数联用,以产生相关的调试出错信息。

3.PHP的自定义常量

除预定义常量外,PHP也支持用define()函数自定义常量,例如:

<?php

Define(STR,”A constant string”);

Echo STR;

?>

注意:常量一旦定义,在程序中就不允许再更改它的值。

4.PHP中的变量类型

l integer:整型

l floating point number (double):浮点型(或双精度型)。

l boolean:布尔型(PHP4)

l string:字符串

l array:数组

l object:对象

PHP中的变量属于松散数据类型,不必由编程者自己定义,而是在使用时由PHP编译器动态进行类型指定或转换,变量名要以“$”符号开头,且区分大小写。变量如果未赋值而直接使用,变量值将被视为空。

5.路径书写的注意

在字符串中表示路径时尽量用“\”,不要用“”,以免编译系统产生误解。

8.PHP的变量类型转换

变量的自动转换主要依赖于操作符,如用“.=”将会转换为字符,用“+=”将会转换为数字。在四则运算中,字符串会自动转换为数字。如果字符串中含有“.”、“e”或者“E”,将被转换为浮点型数据,否则将按整型来处理,字符串中不符合数字规则的部分将被舍去。如果字符串以普通字符开头,在转换为数字时将被视为0。此外,字符串的自增、自减运算是在字符串中最后一个字符的ASCII码基础上进行的。

<?php

$Var1=3; //$Var1 是整数3

$Var.1=”10a”; //$Var1 现在是字符串”310a”

$Var2=”1”; //$Var2是字符串”1”

$Var2++; //$Var2变为字符串”2”!!

$Var2+=1; //$Var2变为整数3

$Var2+=1.1; //$Var2变为浮点型4.1

$Var2=”a”; //$Var2是字符串”a”

$Var2++; //$Var2变为字符串”b”!!

$Var2=”ab”; //$Var2是字符串”ab”

$Var2++; //$Var2变为字符串”ac”!!

$Var3=1; //$Var3为整数1

$Var3+=”10a”; //$Var3变为整数11!!

$Var4=1; //$Var4为整数

$Var4+=”a10”; //$Var4还是整数1!!

$Var4+=”-10a”; //$Var4变为整数-9!!

?>

Posted in php. 标签:, . No Comments »