php个人工作经验以及生活体会博客 php工作,生活

24二/127

mysql 中show 命令用法详细介绍 mysql过程(procedure)的使用

转载一篇关于mysql命令的文章

a. show tables或show tables from database_name; -- 显示当前数据库中所有表的名称
b. show databases; -- 显示mysql中所有数据库的名称
c. show columns from table_name from database_name; 或show columns from database_name.table_name; -- 显示表中列名称
d. show grants for user_name; -- 显示一个用户的权限,显示结果类似于grant 命令
e. show index from table_name; -- 显示表的索引
f. show status; -- 显示一些系统特定资源的信息,例如,正在运行的线程数量
g. show variables; -- 显示系统变量的名称和值
h. show processlist; -- 显示系统中正在运行的所有进程,也就是当前正在执行的查询。大多数用户可以查看他们自己的进程,但是如果他们拥有process权限,就可以查看所有人的进程,包括密码。
i. show table status; -- 显示当前使用或者指定的database中的每个表的信息。信息包括表类型和表的最新更新时间
j. show privileges; -- 显示服务器所支持的不同权限
k. show create database database_name; -- 显示create database 语句是否能够创建指定的数据库
l. show create table table_name; -- 显示create database 语句是否能够创建指定的数据库
m. show engies; -- 显示安装以后可用的存储引擎和默认引擎。
n. show innodb status; -- 显示innoDB存储引擎的状态
o. show logs; -- 显示BDB存储引擎的日志
p. show warnings; -- 显示最后一个执行的语句所产生的错误、警告和通知
q. show errors; -- 只显示最后一个执行语句所产生的错误
r. show [storage] engines; --显示安装后的可用存储引擎和默认引擎
s. show procedure status --显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过
程名称,创建时间等
t. show create procedure sp_name --显示某一个存储过程的详细信息

一下午研究了两个内容:触发器与过程.

触发器是在执行某种操作(插入,更新,删除)时(前,后)进行的操作. 这个功能完全可以由C语言实现,而且更简单. mysql中触发器的使用还要涉及到变量之类的,不如用C实现起来简单,所以这里就不介绍了.

过程(procedure)相当于C语言中的子函数:

1,创建:

create procedure procedure_name() select * from table_name;

2,调用:

call procedure_name;

3,查看:

查看过程的内容有三种方法:
1,show create procedure procedure_name;
2,show procedure status like 'procedure_name'
3,select * from mysql.proc where name='procedure_name'

4,删除:

drop procedure procedure_name;

一些存储过程以及函数的例子

delimiter |
定义procedure
create procedure p2_test1 (OUT para1 int)
begin
select sum(val) into para1 from test1;
end
|
调用procedure
call p2_test1(@sum)|
select @sum|

alter procedure没有研究出来

定义函数
create function f_test1(name char(20)) returns char(20) //参数没有IN,OUT,都是IN
begin
return concat('Hello ',name,' !');
end
|
调用函数
select f_test1('hongjian')|

三种不同的show的用法
show procedure status
show function status
show triggers //注意,没有status

语法:
CREATE PROCEDURE sp_name ([IN |OUT |INOUT] param type,...)
begin
routine_body
end

CREATE FUNCTION sp_name (para,...) RETURNS type
begin
routing_body
endmysql5支持的存储过程语句声明 描述

CREATE PROCEDURE 建立一个存放在MySQL数据库的表格的存储过程。
REATE FUNCTION 建立一个用户自定义的函数,尤其是返回数据的存储过程。
ALTER PROCEDURE 更改用CREATE PROCEDURE 建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。.
ALTER FUNCTION 更改用CREATE FUNCTION 建立的预先指定的存储过程,其不会影响相关存储过程或存储功能。.
DROP PROCEDURE 从MySQL的表格中删除一个或多个存储过程。
DROP FUNCTION 从MySQL的表格中删除一个或多个存储函数。
SHOW CREATE PROCEDURE 返回使用CREATE PROCEDURE 建立的预先指定的存储过程的文本。这一声明是SQL:2003规范的一个MySQL扩展。
SHOW CREATE FUNCTION 返回使用CREATE FUNCTION建立的预先指定的存储过程的文本。这一声明是SQL:2003规范的一个MySQL扩展。
SHOW PROCEDURE STATUS 返回一个预先指定的存储过程的特性,包括名称、类型、建立者、建立日期、以及更改日期。这一声明是SQL:2003规范的一个MySQL扩展。
SHOW FUNCTION STATUS 返回一个预先指定的存储函数的特性,包括名称、类型、建立者、建立日期、以及更改日期。这一声明是SQL:2003规范的一个MySQL扩展。
CALL 调用一个使用CREATE PROCEDURE建立的预先指定的存储过程。
BEGIN ... END 包含一组执行的多声明。
DECLARE 用于指定当地变量、环境、处理器,以及指针。
SET 用于更改当地和全局服务器变量的值。
SELECT ... INTO 用于存储显示变量的纵列。
OPEN 用于打开一个指针。
FETCH 使用特定指针来获得下一列。
CLOSE 用于关闭和打开指针。
IF 一个An if-then-else-end if 声明。
CASE ... WHEN 一个 case声明的结构
LOOP 一个简单的循环结构;可以使用LE***E 语句来退出。
LE***E 用于退出IF,CASE,LOOP,REPEAT以及WHILE 语句。
ITERATE 用于重新开始循环。
REPEAT 在结束时测试的循环。
WHILE 在开始时测试的循环。
RETURNS 返回一个存储过程的值建一个存储过程
create procedure p1(appid varchar(50))
begin
select APPNAME from APPINFO where ID=appid;
end
在mysq1中不支持create or replace procedure p1()

删除存储过程
drop procedure p1;

若要查看当前数据库中所有已存在的存储过程,则输入:show procedure status;
若要查看某一个存储过程,则输入:show create procedure proc_name;

//使用游标
create procedure p3()
begin
//可以把相同类型的变量放在一起声明
declare sum,t,no_more_record Integer;
DECLARE cursor_total CURSOR FOR select Total from PNUMBER;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_record=1;//此处必须先声明no_more_record
//必须把所有变量都声明完后,才能给变量赋值
set sum=0,t=0,no_more_record=0;//可以在同一行给多个变量赋值
open cursor_total;
repeat
fetch cursor_total into t;//mysql在取下一条记录时,若为空,则将no_more_record赋为1,但其记录还是最后一条记录
if(no_more_record!=1) then
set sum=sum+t;
end if;
until no_more_record
end repeat;//此处必须有分号
close cursor_total;
set no_more_record=0;
end

标签: , 7 评论
19二/1219

LBcms告一段落

利用业余时间使用thinkphp做了一款cms:【热点中国】,现在终于实现了其基本功能,算是告一段落了。
以后要做的就是在推销网站时根据需要增加相应的功能
热点中国
前台界面:

后台界面

10二/1215

减少MySQL的Sleep进程有效方法

减少MySQL的Sleep进程有效方法
Post by vohot. Filed under PHP & MySQL.

经常遇到很多朋友问到,他的MySQL中有很多Sleep进程,严重占用MySQL的资源,现在分析一下出现这种现象的原因和解决办法:

1,通常来说,MySQL出现大量Sleep进程是因为采用的PHP的MySQL长链接数据库方式,即使用了mysql_pconnect来打开链接数据库,解决办法就是使用“短”链接,即mysql_connect函数。

2,在使用mysql_connect短链接方式打开数据库,每个页面在打开数据库后,执行SQL完成,当页面脚本结束的时候,这个MySQL连接会自动关闭并且释放内存。但仍然出现大量Sleep进程,可以看看网站是否存在以下几个方面的问题。

A,硬盘上存在大量的静态文件,或者WEB服务器负荷太重,在处理HTTP请求响应变得太慢,这样也有可能导致出现大量Sleep进程,解决方法适当调整WEB服务参数和文件,一味的静态或者缓存化网页内容并不是灵丹妙药。

B,在网页脚本中,有些计算和应用可能非常耗时,比如在0秒的时候打开数据库执行完一段SQL代码后,网页脚本随即花了20秒钟进行一段复杂的运算,或者是require了一个庞大的PHP文件(比如含有几千个违规关键字的过滤函数),哪么这个时候在MySQL后台看到的进程中,这个20秒的过程MySQL并没有做任何事情了,一直处于Sleep状态,直到这个页面执行完毕或者达到wait_timeout值(被强行关闭),优化网页脚本,尽量让程序快速运行,或者在执行这段耗时的运行过程中,执行mysql_close把当前MySQL链接强行关闭。

C,在采集站中,MySQL中大量的Sleep进程这类现象尤其明显(比如很多网友问道DeDeCMS的MySQL中出现大量Sleep),因为大部的采集器页面在运行过程中,事先打开了一个MySQL链接(可能是为了验证用户权限等),然后开始使用file_get_contents之类的操作去获取一个远程的网页内容,如果这个远程的站点访问速度太慢,比如花了10秒时间才把网页取回,哪么当前采集脚本程序就一直阻塞在这里,并且MySQL啥事也没干,一直处于Sleep状态。解决方法同上,在发出file_get_contents采集远程网页的时候,使用mysql_close强行关闭MySQL的连接,等采集完成在适当需要的时候再重新mysql_connect即可。

总的说来,MySQL是一个非常高效快速的数据库,要让他发挥到最大的性能,同时也不要过量的去掘取他的优势所在,适当的分表(超过10G的表,在打开和关闭以前更新的时候效率明显下降很多),尽可能的优化SQL都可以做到事半功倍的。

标签: , 15 评论
6二/121

dede 调用当前文章url

在dede里面调用当前文章的url稍作二次开发就可以了,不用像网上说那样添加什么js的。
过程如下:
1,首先在("/include/common.func.php")文件里添加一个函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//在文章页面显示当前url
function thisUrl($id) {
    $dsql = new DedeSql(false);
    $row  = $dsql->GetOne("SELECT * FROM `#@__archives` WHERE `id` = {$id} ORDER BY `id` DESC  LIMIT 0, 1");
    $row2 = $dsql->GetOne("SELECT * FROM `#@__arctype` WHERE `id` = {$row['typeid']} ORDER BY `id` DESC  LIMIT 0, 1");
    $y=date("Y",$row['senddate']);
    $m=date("m",$row['senddate']);
    $d=date("d",$row['senddate']);
    $row2['typedir']=str_replace('{cmspath}','http://www.58w.cn',$row2['typedir']);
    $row2['namerule']=str_replace('{typedir}',$row2['typedir'],$row2['namerule']);
    $row2['namerule']=str_replace('{timestamp}',$row2['senddate'],$row2['namerule']);
    $row2['namerule']=str_replace('{aid}',$row['id'],$row2['namerule']);
    $row2['namerule']=str_replace('{Y}',$y,$row2['namerule']);
    $row2['namerule']=str_replace('{M}',$m,$row2['namerule']);
    $row2['namerule']=str_replace('{D}',$d,$row2['namerule']);
    $row2['url']=$row2['namerule'];
    return $row2['url'];
}

2,在文章模板里面使用这串标签就可以实现调用当前文章url的功能了

1
{dede:field name='id' function='thisUrl(@me)'/}
标签: , 1个评论
3二/121

dede在列表页面添加本栏目最新的文章

今天www.58w.cn要做新的模板,特殊之处在于在列表页面和文章页面使用同一套模板,但是列表页面调用的是本栏目最新的一片文章。
具体做法:
1,在include/common.func.php文件中添加函数

1
2
3
4
5
6
7
8
//在列表页下显示最新文章
function getlmactile($actileid,$key='body'){
    $dsql = new DedeSql(false);
    $row = $dsql->GetOne("SELECT * FROM `#@__addonarticle` WHERE `typeid` = {$actileid} ORDER BY `aid` DESC  LIMIT 0, 1");
    $row2 = $dsql->GetOne("SELECT * FROM `#@__archives` WHERE `typeid` = {$actileid} ORDER BY `id` DESC  LIMIT 0, 1");
    $arr= array_merge($row,$row2);
    return $arr[$key];
}

2,在列表页面中使用类似这样的标签

1
2
{dede:field.id function="getlmactile(@me,'title')"/}
//title代表返回文章标题,你想返回数据库里的那个字段就在这个地方写上数据库字段名

演示地址:http://www.58w.cn/plus/list.php?tid=153

   下一页