一、设计
1、表引擎尽量使用InnoDB,除非有其它特定功能需求才使用其它表引擎。
2、字段数据类型,MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。更小的通常更好,例如varchar(5)和varchar(100)都能满足,那么坚决使用更小的那个;数字要用数字类型,尽量不要用字符串;有时候可以使用枚举列代替常用的字符串类型。
3、列与表关联,表设计中不要有太多的列,表关联数量最好不要超过3个。
4、范式和反范式,表设计不一定完全遵守三大范式,有时候需要反范式,例如有时需要添加冗余字段简化业务与查询。
5、缓存表和汇总表,如果在数据库层面优化比较麻烦,可以考虑在业务层面优化,考虑加入缓存表与汇总表,特别是一些统计功能,有时候这样能简化业务,效率更高。
二、索引
当表中的数据量越来越大时,就要考虑建索引了,索引优化应该是对查询性能优化最有效的手段了。Mysql中,最常见的有B+树索引和哈希索引。
1、B+树索引
InnoDB表引擎默认使用B+树索引,B+树索引适合范围:精确查找、范围查找、前缀查找。
精确查找就是值等于(=)的查找;范围查找是<、<=、>、>=查找;前缀查找是以字符开头的查找。
-
单列索引
只有一个字段的索引。 -
联合索引
包含多个字段的索引,联合索引遵循最左侧原则,意思是where 后面带的条件字段要有最左边的字段,否则不走索引,例如:a,b,c三个字段组成的索引,where 条件后面要包含a字段。 -
索引操作
创建索引:
alter table tb_name add index 索引名称 (列名);
删除索引:
alter table tb_name drop index 索引名称;
查看索引:
show index from tb_name;
-
查看sql语句执行计划
sql 执行语句前面加上explain关键字就可以查看执行计划,这样就能判断sql 语句走没走索引。
-
要注意不走索引的情况
现有一张预警日志表,建立一个包含三个字段的联合索引,最左侧是create_time字段。
1、不遵循最左侧原则。
2、模糊查找不走索引,像 where grade like ‘%1208%’,但 grade like '1208%'这样以字符串开头却会走索引。
3、索引列参与计算,不走索引
SELECT * FROM student WHERE age+10=30;<