mysql 调试和优化
1.调试 mysql 命令方法: mysql>explain select * from t1 \G 或: mysql>desc select * from t1 \G 主要查看以下属性:
(1)type 是否用到索引
(2)key 索引名称
(3)rows 查询影响的行数(越少说明优化的越好)
2.用 mysql 命令获得一些服务优化信息:
(1)show status like 'com_%'; #主要看 com_select,com_insert,com_update,com_delete,查到都是本次服务启动后的会话结 果,当然其中包括所有的数据为存储类型
(2)就想查看 innodb 的这些信息: show status like 'innodb_rows_%'; 主 要 查 看 innodb_rows_read,innodb_rows_inesrted,innodb_rows_updated,innodb_rows_deleted 这四个参数
(3)show status like 'connections'; #查看连接 mysql 服务器的次数
(4)show status like 'uptime'; #mysql 服务器的工作时间
(5)show status like 'slow_queries'; #慢查询的次数
3.索引优化问题:
(1)一般的要加索引的字段为:where 后面字段
(2)order by 后面的字段
(3)like 后 3%这种形式而不是%3 这种形式
(4)or 前后字段都要用到索引
(5)复合索引的第一个字段
(6)创建索引:mysql>create index ind_name on t1(name);
(7)查看索引使用情况: mysql>show status like 'handler_read%'; #如果其中 handler_read_rnd_next 的值高则索引低效,需要去优化索引,而如果低则说明索引 高效.
4.常用的 sql 表的导入导出优化:
(1)mysql>alter table t1 disable keys mysql>load data infile 'c:/t1.txt'; mysql>alter table t1 enable keys;
(2)mysql>set unique_checks=0; mysql>load data...; msyql>set unique_checks=1;
(3)mysql>autocommit=0; mysql>load data...; mysql>autocommit=1;
5.优化 insert 语句,最好用一行多值的这种形式: insert into t1(name) values(1),(2),(3)
6.当一个文件装载一个表时,用 load data infile 要比很多 insert 语句快 20 倍,而 mysqlimport 这种导入也很快,因为它用的本来就是 load data infile 这种函数接口.
7.查询包括 group by 但如何避免排序结果的消耗: mysql>desc select id from t1 group by id order by null \G
8.优化嵌套查询:
(1)mysql>desc select * from t1 where s_id not in (select id from comany2) \G
(2)mysql>desc select * form t1 left join company2 on t1.s_id=comany2.id where t1.s_id is null \G #以上 left join 这种形式明显快于 not in ()这种子查询,因为 join 不需要在内存中建立临时表来 完成这个逻辑上需要两个步骤的查询工作.
9.sql 索引提示:
(1)use index mysql>desc select * from t1 use index (ind_id) where id=3 \G
(2)ignore index mysql>desc select * from t1 ignore index (ind_id) where id=3\G
(3)force index mysql>desc select * from t1 force index (ind_id) where id>0 \G #注意这种 where 后这种带范围判断的字段的索引是不起作用的,但可以人为的强制去用 index,虽然对影响 rows 起不到作用,这是 mysql 留给用户的一个自行选择计划的权力而已.
10.与删除表有关的优化:
1)用 delete 来删除 mysql> delete from t1; Query OK, 10 rows affected (0.01 sec)
2)用 truncate 来删除 mysql> truncate table t2; Query OK, 0 rows affected (0.00 sec) #用两种方法都可以把表中数据清空,但是用第二种明显比第一种速度要快,而且节省内存.