mysql
alter table tableName add(drop index) columnName after 更新表字段
create UNIQUE_INDEX 索引name USING BTREE on tableName(字段) 创建索引
drop table tableName 删除表
create table tablename as select * from tableName2 备份表数据
SELECT * FROM information_schema.columns WHERE column_name='app_id'; 查询数据库中某个字段那个表包含
update tableName t1 inner join tableName2 t2 on 关联条件 set where 关联两个表更新
delete from tablename 删除表数据
mysql 查看执行明细
explain
id
select_type :select查询的类型,主要是区别普通查询和联合查询、子查询之类的复杂查询。
table :输出的行所引用的表。
type:联合查询所使用的类型。ype显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
possible_keys
指出MySQL能使用哪个索引在该表中找到行。如果是空的,没有相关的索引。这时要提高性能,可通过检验WHERE子句,看是否引用某些字段,或者检查字段不是适合索引。
key
显示MySQL实际决定使用的键。如果没有索引被选择,键是NULL。
key_len
显示MySQL决定使用的键长度。如果键是NULL,长度就是NULL。文档提示特别注意这个值可以得出一个多重主键里mysql实际使用了哪一部分。
ref
显示哪个字段或常数与key一起被使用。
rows
这个数表示mysql要遍历多少数据才能找到,在innodb上是不准确的。
Extra plain
如果是Only index,这意味着信息只用索引树中的信息检索出的,这比扫描整个表要快。
如果是where used,就是使用上了where限制。
如果是impossible where 表示用不着where,一般就是没查出来啥。
慎用 max 可用 order by id desc limit 1
0.先运行看看是否真的很慢,注意设置SQL_NO_CACHE
1.where条件单表查,锁定最小返回记录表。这句话的意思是把查询语句的where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高
2.explain查看执行计划,是否与1预期一致(从锁定记录较少的表开始查询)
3.order by limit 形式的sql语句让排序的表优先查
4.了解业务方使用场景
5.加索引时参照建索引的几大原则
6.观察结果,不符合预期继续从0分析
一:
innodb 默认按照主键自增排序
myisam 默认按照物理存储顺序排序 必须养成追加写order by ,id的习惯
批量执行会造成行锁优化为表锁, 所以生产上 sql 要分开写
执行某条sql被锁死
Lock wait timeout exceeded; try restarting transaction
的异常,错误提示的意思,很明显,是因为这条语句被锁住了,所以释放这个锁
innodb_trx
当前运行的所有事务innodb_locks
当前出现的锁innodb_lock_waits
锁等待的对应关系
select * from information_schema.innodb_trx
kill 进程
show processList