索引
原理:
不使用索引,要查询name = 1的数据,则需要检查数据表中的每一行,使用索引,索引会包含每一条数据,并且经行分类,所以会直接查询到 = 1的所有行,并且不会检查其它的数据行。
优点
-
提高查询速度
-
使用min()或max()查询,能迅速找到
-
order by 和 group by 操作迅速完成
-
有时,可以通过读取索引获取数据值,不必再次去读取数据文件
缺点
-
插入、删除、修改速度变慢
-
索引占据磁盘空间
使用规范
-
尽量为判断条件的列建索引,例如where后的列、order by的列
-
考虑数据列维度(即重复值),重复值越少、索引效果越好,例如姓名列就没有必要建立索引
-
为字符串值的前缀索引,减少索引长度,加快速度
-
不要建立过多的索引
-
在where和orderby 的列上建立索引
SQL优化
-
like尽量 不用%开始 ,否则将放弃索引查询
-
避免使用自动转换类型功能,例如数值类型查询不要写‘’
-
尽量避免select *,尽量使用覆盖索引
-
尽量缩短sql长度
-
in、not in 尽量少用,不会使用索引查询,如果是连续数字,可以用between
-
避免对字段进行函数、表达式操作,会导致索引失效
-
组合索引中,如果中间某个字段使用了范围条件,则右边的索引失效
-
尽量不使用 !=和<>,这两个都会导致索引失效
-
数据库类型优化
-
尽量用数值类型而不是字符串类型。字符串比较需要多次进行字节或字符的比较。数值一次就行
-
尽量用小类型。能用float就不用double,10个字节能满足就不要写50
-
根据存储引擎,选择格式。例如myisam尽量使用固定长度类型,char而不是varchar。固定长度的数据列缺点是占用内存多,因为他会用尾椎空格补足长度,但是处理速度快。memory使用固定长度处理,无论你怎么选择。对于innodb则尽量使用varchar,因为它内部不对固定长度和可变长度列区分
-
尽量把数据声明为not null。 因为mysql不需要再特殊处理该列是不是null。
-
清理数据库碎片
-
吧blob、text大字段单独存为一张表
-
合理使用存储引擎
-
是否启用数据库缓存。对于经常变化的表,开启缓存是没有必要的