MySQL触发器解决方案历程
最近,项目中用到mysql,由于数据量非常大,每天的数据量在百万级,考虑到mysql数据库处理性能以及数据属性,决定保存足够多的查询数据即可,距当前时间最久远的数据直接删除,无需进行备份。
头脑中冒出的第一个想法就是,能否利用mysql中的触发器,检查数据表大小,如果超过预设长度,则删除部分数据。
CREATE TRIGGER tg AFTER INSERT ON traffic_info
FOR EACH ROW BEGIN
...
DELETE from traffic_info WHERE time <= "..."
...
END;
执行后出现如下错误:
ERROR 1442 (HY000): Can't update table 'traffic_info' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
原来,目前MySQL触发器还不支持删除触发器所在的表的数据,ok,我原始的想法是每个数据表自己管理表大小,现在看来是行不通了。
第二个想法是干脆用存储过程得了,手动调用存储过程来更新所有表的大小,考虑到数据表很多,想协议个接受数据表名为参数的存储过程:
CREATE PROCEDURE P(IN table_name VARCHAR(50), IN max_count INT)
READS SQL DATA
BEGIN
...
SELECT COUNT(1) from table_name
...
END;
这种做法行不通,mysql会将“table_name”字符串作为表名,搜索后发现,需要用到mysql新特性prepare,不过需要注意的是,就算是利用prepare,还是无法直接传入数据表名,需要利用CONCAT事先连接查询字符串:
CREATE PROCEDURE P(IN table_name VARCHAR(50), IN max_count INT)
READS SQL DATA
BEGIN
...
SET @query_str = CONCAT("SELECT COUNT(1) from ", table_name);
PREPARE stmt from @query_str
EXECUTE stmt;
...
END;
总算是送了一口气,可是又发现,我需要在存储过程中动态获取PREPARE查询的返回结果,但是,目前mysql还无法做到这一点,真是让人失望,看来只能另觅它途了……
时间仓促,今是为记
相关文档:
1. 数据库
切换数据库: use mydb
2. 事件
查看事件: show events
启动调度器: set global event_scheduer = 1;
查看是否启动: show variables like 'event_scheduler';
3. 备份
在administator中的backup中无法备份数据库的事件。需要手动将创建事件的脚本添加到sql备 ......
如果忘记mysql的密码,可以用以下的方式进行修改:
我用的mysql是5.1的server
在windows下:
打开命令行窗口,停止mysql服务:Net stop mysql
到mysql的安装路径启动mysql,在bin目录下使用mysqld.exe启动,在命令行窗口执行:mysqld --skip-grant-tables
然后另外打开一个命入令行窗口,执行mysql,此时无需输入密码 ......
MySQL 5.0 以上支持存储过程。
PHP 5.0 以上的 mysqli 系列函数可以支持操作 MySQL 的存储过程。
以下是一些简单的存储过程和用 PHP 调用的示例。 一、返回单个数据: 1: <?php
2: header("Content-Type:t ......
1.首先,设置数据库支持中文gb2312/gbk。
具体方法:
打开mySQL文件夹,修改my.ini配置文件。
[client]
port=3306
default-character-set=gb2312
以及
[mysqld]下的
default-character-set=gb2312
修改,保存,重启。若设为System服务,可以在控制面板-管理工具-服务中找到mySQL服务,重启。
2.保证Web ......
Another Look at MySQL 5.1's SQL Diagnostic Tools
http://dev.mysql.com/tech-resources/articles/mysql_51_diagnostic_tools.html 数据库的性能决定因素:
(1)数据库的设计
(2)SQL代码 可以用以下几种方法来解决一些性能问题:
(1)索引
(2)水平分区
(3)列适应的表
colum ......