CentOS下Mysql 优化
2018/07 作者:ihunter 0 次 0
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) #用两种方法都可以把表中数据清空,但是用第二种明显比第一种速度要快,而且节省内存.