一、某些数据库的函数会禁用mysql本身的查询缓存
例如,数据库中出现CURDATE(),NOW() 和 RAND() 或是其它的诸如此类的SQL函数都不会开启查询缓存
如果使用缓存的话,可以使用变量代替这种函数结构。
二、可以再数据表前面加上EXPLAIN参数进而帮助自己分析sql语句的查询性能。
可以借助phpmyadmin更清晰的查看数据表运行的更多细节。
EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的……等等,等等。
三、当只要一行数据时使用 LIMIT 1
四、索引并不一定就是给主键或是唯一的字段。
如果在你的表中,有某个字段你总要会经常用来做搜索,那么,请为其建立索引吧。
另外,你应该也需要知道什么样的搜索是不能使用正常的索引的。例如,当你需要在一篇大的文章中搜索一个词时,如: “WHERE post_content LIKE ‘%apple%'”,索引可能是没有意义的。你可能需要使用MySQL全文索引 或是自己做一个索引(比如说:搜索关键词或是Tag什么的)
五、在Join表的时候使用相当类型的例,并将其索引
如果你的应用程序有很多 JOIN 查询,你应该确认两个表中Join的字段是被建过索引的。这样,MySQL内部会启动为你优化Join的SQL语句的机制。
六、千万不要 ORDER BY RAND()
如果你真的想把返回的数据行打乱了,你有N种方法可以达到这个目的。这样使用只让你的数据库的性能呈指数级的下降。
七、避免 SELECT *
八、永远为每张表设置一个ID
我们应该为数据库里的每张表都设置一个ID做为其主键,而且最好的是一个INT型的(推荐使用UNSIGNED),并设置上自动增加的AUTO_INCREMENT标志。
九、使用 ENUM 而不是 VARCHAR
你知道这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是 VARCHAR。
十、从 PROCEDURE ANALYSE() 取得建议
在phpmyadmin中的表现为,查看表结构,表下面有个字段显示是"规划表结构",这里会给你一些关于表的一些建议。仅供参考,只有表的数据比较大的时候,这些建议才会变的准确,否则可以不采纳。
十一、尽可能的使用 NOT NULL
十二、垂直分割
十三、拆分大的 DELETE 或 INSERT 语句
对于牵涉到大批量的更新和删除的操作时候,可以分批处理 ,处理完一批,休息一下,然后继续。
例如:
while (1) {
//每次只做1000条
mysql_query("DELETE FROM logs WHERE log_date <= '2009-11-01' LIMIT 1000");
if (mysql_affected_rows() == 0) {
// 没得可删了,退出!
break;
}
// 每次都要休息一会儿
usleep(50000);
}
十四、选择合适的存储引擎
MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的。
InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。他是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。
网友评论