可以查询缓存时优化查询
大多数MySQL服务器都开启了查询缓存,当多次进行相同的查询的时候会优先查询缓存数据,但是书写SQL语句时可能会导致忽略查询缓存,例如再查询语句中使用了函数CURDATE(),需要使用变量代替函数
在SELECT查询中使用EXPLAIN
使用EXPLAIN时可以分析SQL语句中的性能瓶颈,进行优化
善于使用LIMIT
在只需要一行数据或者清楚数据行数的时候使用LIMIT增加性能,在查询到数据后停止查询
为搜索字段创建索引
索引并不一定是主键或者唯一的字段,对于经常使用到的字段进行创建索引提升性能
使用Join表的时候使用相当类型的数据并将其索引
在使用Join查询的时候确认两个表中的字段是被建过索引并且同类型的,mysql内部会优化join的sql语句
不要使用order by rand()
MySQL执行rand()函数进行数据的重新排列,性能极具下降
避免使用SELECT *
查询的数据越多,效率越低,只查询需要的字段
为每张表设置ID作为主键
每张表都使用ID作为主键,最好设置为INT类型,(推荐使用UNSIGNED)并设置自增标志
使用ENUM而不是varchar
ENUM类型更紧凑,保存的是TINYINT,但外表显示字符串,对于部分字段取值固定并且有限应该使用ENUM
从PROCEDURE ANALYSE()获取建议
Procedure analyse()会让mysql去分析字段和实际的数据并提供建议
尽可能使用NOT NULL
Null也需要额外的空间,非必要不使用
Prepared Statements
检查绑定的变量,防止SQL注入的攻击,执行多次相同查询的时候提升效率
无缓冲的查询
执行SQL语句的时候程序会等待SQL语句返回,使用无缓冲只需要第一行数据返回的时候可以马上开始工作查询结果了
IP地址存成UNSIGNEDINT
IP地址会使用32位无符号整型
固定长度的表会更快
表中所有字段都是固定长度,整个表会被认为static或fixed-length。表字段没有varcahr text blob。固定字段提高性能,搜寻更快,
垂直分割
将数据表中按列变成几张表,降低表的复杂度和字段的数目
拆分大的DELETE或INSERT语句
越小的列越快
根据表的大小设置字段类型是int还是smallint或者tinyint
选择正确的存储引擎
MyISAM适合大量 查询的应用,不适用大量写操作
InnoDB对于小的应用,会比MyISAM还慢
使用一个对象关系映射器
ORM提升性能,只有在需要取值时候才会使用,在大量查询的时候提升性能,并且将SQL语句打包成事务
小心“永久链接”
一个链接被创建了永远处在连接的状态,占据性能