原标题:我在 MySQL 上作了哪些优化
原文连接:zhoupq.com/我在-MySQL-上作…
转载请注明出处mysql
本文记录了我这一年的时间里是如何对项目中用到的 MySQL 进行优化。带有必定的主观性和局限性,请各位支持的同时,不吝赐教。
算法
若是你跟我同样不幸,不只选择了 Win os 作服务器系统,还选择了 Developer Machine(开发机器),兄弟抱一个,不要哭,重装。发生这些上述不幸的缘由已经不重要,须要作的是必须切换成 Dedicated MySQL Server Machine(专用MySQL服务器)。sql
重装切换以后,你会发现,以前安装的必定是假的 MySQL。数据库
从开发维护的角度看,若是不肯定列是否为 NULL,那么在 SQL 中,就必须加上 “AND tab_NAME != NULL AND tab_NAME != ''”,很容易被忽略,代码越多,出错的几率就越大。缓存
索引我作了三点优化:bash
简单举例:现有字段“a”、“b”、“c”、“d”组成的联合索引“abcd”,SQL 条件部分为:服务器
1 用到索引为“abcd”,2 用到的索引为“abd”, (2 同 1)3 用到的索引为“abc”。条件的顺序很重要。跟自拍同样,脸大的站后面。
抱歉,上述第二点同第一点,一样用到的索引为“abcd”。
利用 EXPLAIN 工具分析:app
// 建表语句略,已知建立了组合索引 (abcd)
mysql> EXPLAIN SELECT * FROM test t WHERE t.a = 'q' AND t.b = 'w' AND t.c = 'e' AND t.d = 'f';
+----+-------------+-------+------+---------------+------+---------+-------------------------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+-------------------------+------+--------------------------+
| 1 | SIMPLE | t | ref | name | name | 360 | const,const,const,const | 1 | Using where; Using index |
+----+-------------+-------+------+---------------+------+---------+-------------------------+------+--------------------------+
1 row in set
mysql> EXPLAIN SELECT * FROM test t WHERE t.a = 'q' AND t.b = 'w' AND t.d = 'f' AND t.c = 'e';
+----+-------------+-------+------+---------------+------+---------+-------------------------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+-------------------------+------+--------------------------+
| 1 | SIMPLE | t | ref | name | name | 360 | const,const,const,const | 1 | Using where; Using index |
+----+-------------+-------+------+---------------+------+---------+-------------------------+------+--------------------------+
1 row in set复制代码
更多内容请移步个人其余博文:MySQL 高性能索引以前缀索引框架
多个 LEFT JOIN 确定不行,即便有索引,也很容易形成全表扫描,为了减小该状况发生的几率,我通常会采起两种方法:分布式
衡量一个 DBA 的水平有多高,得看他反范式能力有多强。
—— 知乎
好比我要根据 A表 的日期,关联 B表,统计出每一个日期下某个属性的数量。我能够在A表中添加一列,用来存储“数量”,虽然违反了范式,可是性能上获得了提高。我以为这是一笔划算的买卖。
规范化是为了技术服务,而技术是为业务服务。规范化也就是套路,能保证不出错,可是并不能解决特殊问题,特殊问题还须要特殊处理。
以上是仅针对数据库作的优化,至于缓存(一级缓存、二级缓存),那属于持久层框架的职责,不在此文记录范围以内。