mysql
查看连接状态: show processlist;
重新初始化连接资源: mysql_reset_connection() 影响:变量的丢失与清除 锁 事务回滚 TEMPORARY表会清除等
查询缓存(mysql8.0后去除查询缓存): my.cnf中query_cache_type=1开启, 或者显示指定 select SQL_CACHE * from t;
事务 (建议: set autocommit=1):
读未提交 reand uncommitted- 一个事务还没提交时 做的变更就能被别的事务看到。 脏读 不可重复读
读提交 read committed- 一个事务提交后 做的变更才能被别的事务看到。幻读 不可重复读
可重复读 repeatable read- 一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的当然在可重复读隔离级别下,
未提交变更对其他事务也是不可见的。幻读
串行化 serializable- 对于同一行记录,“写”会加“写锁”,“读”会加“读锁”
当出现读写锁冲突的时候 后访问的事务必须等前一个事务执行完成,才能继续执行
查看隔离级别: show variables like 'transaction_isolation'(mysql5.7) 老版本: show variables like 'tx_isolation';;
查询长事务(查找持续时间超过60s的事务):
select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60;
索引:
创建索引:
alter table table_name add INDEX index_name(字段); 普通索引
alter table table_name add UNIQUE (字段); 唯一索引
alter table table_name add PRIMARY KEY (字段); 主键索引
删除索引:
drop INDEX index_name ON table_name;
alter table table_name DROP INDEX index_name;
alter table table_name DROP PRIMARY KEY;
查看索引:
show index from table_name;
show keys from talbe_name;
联合索引(name age)
使用索引格式: where name like "王%"
锁:
全局锁:
当需要让整个库处于只读状态 执行 :
1 flush tables with read lock;(FTWRL) (用这个, 原因:global变量方式影响比较大,还有数据库
异常 readonly会一直保持,导致库一直处于不可写状态,用ftwrl遇到异常,mysql会自动释放锁)
2 set global readonly=true
表级锁:
lock tables table_name read/write
unlock tables 释放锁
导出数据:
mysqldump --single-transaction(参数:导出数据会启动一个事务 确保拿到的数据是一致的 由于MVCC的支持 这个过程中数据是可以正常更新的)
技巧:
数据量很大的时候,二级索引比主键索引更快:这种情况只有在使用覆盖索引时才成立,不用回表。
FAQ:
删除主键索引:
alter table T drop primary key;
alter table T add primary key(id);
答案: 上面重建主键的过程不合理。不论是删除主键还是创建主键,都会将整个表重建,所以连着执行这两个语句的话,第一个语句就白做了,
你可以用这个语句代替: alter table T engine=InnoDB