1、为查询缓存优化 SQL 语句
Mysql数据库引擎提供的查询缓存功能可以有效提高性能。当很多相同的查询执行多次的时候,这些查询的结果会被放到缓存中,然后新的查询就不需要访问数据库而是直接访问缓存结果。
有些 SQL 语句是不被缓存的
1)查询缓存不开启
$r = mysql_query("select * from um_user where gmt_create > CURDATE()")
其中的 CURDATE()函数的结果不会被缓存
2)开启缓存查询
$today = date("Y-m-h")
$r = mysql_query("select * from um_user where gmt_create > '$today'");
2、Explain SQL 语句
检查 rows,索引命中情况 keylen
3、当只要一行数据时使用 limit 1,比如一些 判断是否有符合条件的语句,这样mysql 引擎在查找到一条语句后就会停止搜索
4、为搜索字段建立索引,比如 like 'a%',这种可以命中索引,而 '%a%'不能命中
5、为join 的字段建立索引,并且确保 join 的字段是相同类型。
6、总是给表设置一个 id
7、使用 ENUM 而不是 VARCHAR,ENUM在数据库里是 tinyint
8、字段尽量使用 NOT NULL
9、Prepared statments 很像存储过程,是运行在后台的SQL 语句集合,可以检查绑定变量,防止 SQL 注入,性能方面,采用二进制传输,也有缓存功能
10、把 IP 地址存成 UNSIGNED INT,INET_ATON()把字符串ip转换成 整形,INET_NTOA()把整型ip转换成字符串
11、表的垂直分割,表的字段数不要过多,按照逻辑分离
12、Insert 和 Delete 操作是会锁表的,所以如果影响数量比较多的时候需要分批执行,用limit
13、Myisam 适合于大量查询操作,InnoDB适合比较多的写操作,支持行锁和事务。
14、尽量使用ORM,可以有比较好的性能,"Lazy Loading",只有需要取值的时候才会真正去做。SQL语句可能打包成事务执行。
15、索引与优化:
1)选择索引数据类型:小的数据类型;简单的数据类型,比如 整型优于字符串,应该用内置日期类型存时间,用UINT 存Ip;尽量避免 NULL,因为NULL很难做查询优化。
2)索引的顺序问题