1、当使用索引列进行查询的时候尽量不要使用表达式,把计算放再业务层而不是数据库层。
2、尽量使用主键查询,而不是其他索引,因此主键查询不会触发回表查询。
3、使用前缀索引。
4、使用索引扫描来排序。
5、union all,in,or 都能使用索引,但是推荐使用in。
6、范围列可以用到索引。
6.1、范围条件是:<、<=、>、>=、between
6.2、范围列可以用到索引,但是范围后面的列无法用到索引,索引最多用于一个范围列
7、强制类型转换会全表扫描
8、更新十分频繁,数据区分度不高的字段不宜建立索引
8.1、更新会变更B+树,更新频繁的字段建议索引会大大降低数据库性能
8.2、类似于性别这类区分不大的属性,建立索引是没有意义的,不能有效的过滤数据
8.3、一般区分度在80%以上的时候就可以建立索引,区分度可以使用count(distinct(列名))/count(*)来计算
9、创建索引的列,不允许为null,可能会得到不符合预期的结果
10、当需要进行表连接的时候,最好不要超过三张表,因为需要join的字段,数据类型必须一致
11、能使用limit的时候尽量使用limit,大数据量不推荐,建议改为子查询或union all
12、单表索引建议控制在5个以内(现在没有太多的限制)
13、单索引字段不允许超过5个(组合索引)
14、创建索引的时候应该避免一下错误概念
14.1、索引越多越好
14.2、过早优化,在不了解系统的情况下进行优化
【索引监控】
show status like 'Handler_read%';
参数解释:
a、Handler_read_first:读取索引第一个条目的次数
b、Handler_read_key:通过索引获取数据的次数
c、Handler_read_last:读取索引最后一个条目的次数
d、Handler_read_next:通过索引读取下一条数据的次数
e、Handler_read_prev:通过索引读取上一条数据的次数
f、Handler_read_rnd:从固定位置读取数据的次数
g、Handler_read_rnd_next:从数据节点读取下一条数据的次数
【性能监控】
5.7后废弃deprecated
查询后整体显示:show profiles;
查询后分步显示:show profile all for query 1;
开启:set profiling=1;
执行计划:explain
推荐performance schema
show processlist
show variables
【schema与数据类型优化】(高性能mysql)
用整形存储ip地址:select inet_aton('192.168.1.1')
null!=null
TCP/IP协议:
应用层
exec 8<> /dev/tcp/www.baidu.com/80
echo -e "GET / HTTP/1.0\n" >& 8
cat <& 8
传输层
netstat -anop
数据链路层
arp -a
tcpdump --n -i eth0 arp pr port 80