2010-07-19 帖子
时间:2010-07-19 来源:有行动才会有收获
mysql的 undo log 放在共享表空间中,也就是 ibdata1 里面,这个文件还存放数据字典信息。
mysql的 redo log 放在 ib_logfile0、 ib_logfile1 里面,也就是普通的日志文件就是 redo log。
--------------------------------------------------
计算某一值连续出现的最大次数
[email protected] : test > select * from itpub1; +------+------+ | id | name | +------+------+ | 1 | 1 | | 2 | 1 | | 3 | 1 | | 4 | 1 | | 5 | 2 | | 6 | 2 | | 7 | 1 | | 8 | 1 | +------+------+ 8 rows in set (0.00 sec)
[email protected] : test > select aa.name,max(rownum) maxrow from ( select ib.id,ib.name,if((ib.name=@pname) , @row:=@row+1 , @row:=1) rownum , @pname:=ib.name pn from itpub1 ib, (select @row:=0, @pname:='000000') row1 ) aa group by aa.name; +------+--------+ | name | maxrow | +------+--------+ | 1 | 4 | | 2 | 2 | +------+--------+ 2 rows in set (0.00 sec)
--------------------------------------------------
切换表: create table log_temp like logs; rename table logs to log_xxxx, log_temp to logs;
可以配合shell脚本,写入crontab中,每隔一段时间自动切换一次表
--------------------------------------------------
在创建表的时候使用 `c2` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 只有当真正有数据被改变时才会激活 ON UPDATE CURRENT_TIMESTAMP 也就是,如果新值等于旧值,MySQL是不会激活on update事件的,所以c2列也不会被更新 myisam和innodb都是如此
root:[test]> desc a; +-------+-----------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------+-----------+------+-----+-------------------+-----------------------------+ | c1 | int(11) | YES | | NULL | | | c2 | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | +-------+-----------+------+-----+-------------------+-----------------------------+ 2 rows in set (0.00 sec)
root:[test]> insert a (c1) values (1),(2); Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0
root:[test]> select * from a; +------+---------------------+ | c1 | c2 | +------+---------------------+ | 1 | 2010-07-19 16:00:00 | | 2 | 2010-07-19 16:00:00 | +------+---------------------+ 2 rows in set (0.00 sec)
root:[test]> update a set c1=3 where c1=1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
root:[test]> select * from a; +------+---------------------+ | c1 | c2 | +------+---------------------+ | 3 | 2010-07-19 16:00:44 | | 2 | 2010-07-19 16:00:00 | +------+---------------------+ 2 rows in set (0.00 sec)
root:[test]> update a set c1=2 where c1=2; Query OK, 0 rows affected (0.00 sec) Rows matched: 1 Changed: 0 Warnings: 0
root:[test]> select * from a; +------+---------------------+ | c1 | c2 | +------+---------------------+ | 3 | 2010-07-19 16:00:44 | | 2 | 2010-07-19 16:00:00 | +------+---------------------+ 2 rows in set (0.00 sec)
--------------------------------------------------
内存表使用哈希散列索引把数据保存在内存中,因此具有极快的速度,适合缓存中小型数据库,但是使用上受到一些限制。 1、内存表对所有用户的连接是可见的,这使得它非常适合做缓存。 2、内存表不允许使用TEXT和BLOB数据类型;只允许使用=和<=>操作符来搜索记录(不允许<、>、<=或>=);不支持auto_increment;只允许对非空数据列进行索引(not null)。 注:操作符 “<=>” 说明:NULL-safe equal,这个操作符和“=”操作符执行相同的比较操作,不过在两个操作码均为NULL时,其所得值为1而不为NULL,而当一个操作码为NULL时,其所得值为0而不为NULL。 3、如果内存表是以create table like方法创建的,则复制之后所有主键、索引、自增等格式将不复存在,需要重新添加主键和索引。 4、一旦服务器重启,所有内存表数据丢失,但是表结构仍然存在,因为内存表结构是存放在实际数据库路径下的,不会删除。 5、对于重启造成的无数据,可以在my.cnf文件中设置init-file="your_sql_file"选项,在sql文件中写入对内存表的数据初始化语句。 6、内存表在并发较高的情况下容易出现死锁,所以要谨慎使用。 7、关键参数 max_heap_table_size
相关阅读 更多 +