MySQL学习笔记

基础

redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志

alter table T engine=InnoDB
Flush tables with read lock (FTWRL)
set long_query_time=0;

实战

analyze table t
alter table t engine = InnoDB
insert ignore into friend(friend_1_id, friend_2_id) values(A,B);
/* 打开optimizer_trace,只对本线程有效 */
SET optimizer_trace='enabled=on'; 
/* @a保存Innodb_rows_read的初始值 */
select VARIABLE_VALUE into @a from  performance_schema.session_status where variable_name = 'Innodb_rows_read';
/* 执行语句 */
select city, name,age from t where city='杭州' order by name limit 1000; 
/* 查看 OPTIMIZER_TRACE 输出 */
SELECT * FROM `information_schema`.`OPTIMIZER_TRACE`\G
/* @b保存Innodb_rows_read的当前值 */
select VARIABLE_VALUE into @b from performance_schema.session_status where variable_name = 'Innodb_rows_read';
/* 计算Innodb_rows_read差值 */
select @b-@a;
SET max_length_for_sort_data = 16;
select word from words order by rand() limit 3;
mysql> select count(*) from tradelog where month(t_modified)=7;
mysql> select * from tradelog where tradeid=110717;

实际上相当于:

mysql> select * from tradelog where  CAST(tradid AS signed int) = 110717;

加了函数操作,就不走索引,导致了全表扫描。 当两张表的字符编码不一样时,join表也有可能导致全表扫描,因为字符编码需要转换,相当于加了函数操作。

show processlist

再查看具体进程的详情:

select * from information_schema.processlist where id=1;

还有一种方法

select blocking_pid from sys.schema_table_lock_waits
select * from t sys.innodb_lock_waits
select * from information_schema.innodb_trx

断开连接之后,一定要通知相应的业务开发团队。

还有一种方法是,通过–skip-grant-tables跳过数据库的权限验证。

insert into query_rewrite.rewrite_rules(pattern, replacement, pattern_database) values ("select * from t where id + 1 = ?", "select * from t where id = ? - 1", "db1");call query_rewrite.flush_rewrite_rules();

主备切换

可靠性优先

误删数据的处理方法

面试

Mysql中ACID是由什么保证的?