MySQL存储程序开发最佳实践
1,开发流程
1,写代码之前设立标准和指南
2,遇到一个问题30分钟不能解决之后寻求帮助
3,相互review代码
4,利用独立的测试人员进行测试
5,使用代码版本控制
2,编码风格和惯例
1,使用一致的、可读性强的代码风格
2,使用有逻辑意义的、一致的命名规范
3,使用block和loop labels作为自我诠释文档
4,复杂的表达式使用括号
5,使用纵向的代码排列来强调纵向关系
6,注释代码简明扼要并且只写“增值”信息
3,变量
1,使用一致的而且有意义的变量命名风格
2,避免在内部block里覆盖变量声明
...
MySQL索引使用
MySQL索引
MySQL 5.1参考手册 :: 7. 优化
MySQL索引分析和优化
MySQL存储程序权限控制
MySQL5.0引入了一些管理存储程序的权限:
CREATE ROUTINE: 允许用户创建新的存储程序
ALTER ROUTINE: 允许用户修改security mode/SQL mode/comment
EXECUTE: 允许用户只需存储程序
给用户赋予权限:
GRANT CREATE ROUTINE ON mydatabase.* TO sp_creator;
GRANT ALTER ROUTINE ON mydatabase.* TO sp_creator;
GRANT EXECUTE ON mydatabase.* TO sp_c ...
MySQL的Stored Function和Trigger
Stored Function
存储Function可以作为表达式在内建方法可以调用的地方使用以及SELECT、UPDATE、DELETE、INSERT语句中使用
CREATE FUNCTION function_name(parameter[,...])
RETURNS datatype
[LANGUAGE SQL]
[ [NOT] DETERMINISTIC]
[ {CONTAINS SQL | NO SQL | MODIFIES SQL DATA | READS SQL DATA} ...
MySQL内建Function
在MySQL存储程序(存储过程、存储Function、触发器)里可以使用几乎任何MySQL内建Function
常用的Function为:
1,字符串function
2,数字function
3,时间和日期function
4,其他function
1,字符串function
字符串function处理VARCHAR/CHAR/TEXT等字符串数据类型
1)ASCII
string = ASCII(string)
返回字符串中首个字符的ASCII码
2)CHAR
string = CHAR(acsii_code[, ...]) ...
MySQL存储过程之事务管理
ACID:Atomic、Consistent、Isolated、Durable
存储程序提供了一个绝佳的机制来定义、封装和管理事务。
1,MySQL的事务支持
MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关:
MyISAM:不支持事务,用于只读程序提高性能
InnoDB:支持ACID事务、行级锁、并发
Berkeley DB:支持事务
隔离级别:
隔离级别决定了一个session中的事务可能对另一个session的影响、并发session对数据库的操作、一个session中所见数据的一致性
ANSI标准定义了4个隔离级别, ...
创建和维护存储程序
1,创建和维护存储程序语法
1)CREATE PROCEDURE
CREATE PROCEDURE procedure_name ([parameter[,...])
[LANGUAGE SQL]
[ [NOT] DETERMINISTIC]
[ {CONTAINS SQL|MODIFIES SQL DATA|READS SQL DATA|NO SQL} ]
[SQL SECURITY {DEFINER|INVOKER}]
[COMMENT comment_string]
procedure_statements
/* par ...
1,简介
MySQL支持HANDLER来处理错误:
Duplicate entry Handler
CREATE PROCEDURE sp_add_location
(in_location VARCHAR(30),
in_address1 VARCHAR(30),
in_address2 VARCHAR(30),
zipcode VARCHAR(10),
OUT out_status VARCHAR(30))
BEGIN
DECLARE CONTINUE HANDLER
...
1,使用非SELECT语句
UPDATE/INSERT/SET、DDL、DML等非查询语句可以随意在存储程序里执行
CREATE PROCEDURE simple_sqls()
BEGIN
DECLARE i INT DEFAULT 1;
/* Example of a utility statement */
DROP TABLE IF EXISTS test_table
CREATE TABLE test_table
(id INT PRIMARY KEY, some_data VARCHAR(30)) ENGINE=in ...
1,代码块
代码顺序
1,变量和条件声明
2,Cursor声明
3,Handler声明
4,程序代码
可以给代码块加lebel,这样END匹配比较直观,还可以用LEAVE语句来终结代码块:
[label:] BEGIN
varaiable and condition declarations
cursor declarations
handler declarations
program code
END [label];
代码块可以嵌套:
CREATE PROCEDURE nested_blocks()
BEGIN
...
存储过程语法基础
1,变量
DECLARE声明,SET赋值
变量类型:
INT, INTEGER
BIGINT
FLOAT
DOUBLE
DECIMAL(precision, scale), NUMERIC(precision, scale)
DATE
DATETIME
CHAR(length)
VARCHAR(length)
BLOB, TEXT
LONGBLOB, LONGTEXT
可以在DECLARE变量时用DEFAULT设置默认值,不设则为NULL
2,参数
参数分IN、OUT和INOUT类型
3,用户变量
以@开头的为用户变量,作用域为sessi ...
1,前提
需要MySQL 5
2,Hello World
MySQL存储过程之Hello World
DELIMITER $$
DROP PROCEDURE IF EXISTS HelloWorld$$
CREATE PROCEDURE HelloWorld()
BEGIN
SELECT "Hello World!";
END$$
DELIMITER ;
3,变量
使用DECLARE来声明,DEFAULT赋默认值,SET赋值
DECLARE counter INT DEFAULT 0;
SET counter = counter+1;
4,参 ...
Hello World之MySQL存储过程版:
DELIMITER $$
DROP PROCEDURE IF EXISTS HelloWorld$$
CREATE PROCEDURE HelloWorld()
BEGIN
SELECT "Hello World!";
END$$
DELIMITER ;
OK,调用一下:
CALL HelloWorld();
结果:
+--------------------+
| Hello World! |
+--------------------+
| Hello World! ...
上次讲到工作中写一个存储过程,很麻烦,不知道该怎样调试,MySQL的存储过程又没有什么调试工具
老邓给的建议是创建一个临时表,存储过程中插一些debug信息到临时表里,然后通过查看临时表记录来人肉调试MySQL
今天一看才知道直接select _var就可以输出变量_var的值啊,瀑布汗-_-!
还可以插入多条select _var1、select _var2语句,直接在console里打印变量的值,我觉得爽了,你呢?
-- FUNCTION check_asset_group_mirror_relationship
DROP FUNCTION IF EXISTS check_asset_group_mirror_relationship;
DELIMITER |
CREATE FUNCTION check_asset_group_mirror_relationship(group_id bigint(20)) RETURNS int
BEGIN
DECLARE group_type varchar(255);
DECLARE mirror_flag int default ...
MySQL自带有全文搜索功能: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
创建一个全文搜索表:
CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
title VARCHAR(200),
body TEXT,
FULLTEXT (title, body)
) ENGINE=MyISAM;
插入几条数据:
INSERT INTO articles (title,body) VA ...
一、两种scaling方式
1,Vertical partitioning,生成的segments称为partitions
2,Horizontal federation,生成的segments称为shards
二、Storage engines
1,MyISAM
IBM开发的ISAM(Indexed Sequential Access Method)的扩展,是MySQL默认的storage engine
MyISAM由三个文件组成,.frm文件存储table定义,.MYD文件存储row data,.MYI文件存储索引
MyISAM使用table-level locking,三种lock类型 ...
- 浏览: 612372 次
- 性别:

- 来自: BJ

- 详细资料
搜索本博客
我的相册
screenshot
共 1 张
共 1 张
最近加入圈子
最新评论
-
深入了解Java ClassLoader ...
当我对字节码编译不知所措的时候,发现了这个帖子 谢谢楼主,目前正在学习ASM C ...
-- by ytzhsh -
Rails里如何结合Exceptio ...
收藏了,小工具,好东西.
-- by yangzhihuan -
使用coderay和railscasts ...
不错,很爽,如果能显示成textmate那样的就好了。
-- by carlosbdw -
Axis2快速上手指南
看得很累,希望楼主写个HelloWorld.谢谢
-- by zznj1123 -
使用coderay和railscasts ...
javaeye自己用的是什么highlight什么的吗?
-- by qichunren






评论排行榜