此文档为2013年学习MySQL时总结的,已许久没有更新,后续会持续更新增加。
1. 当只要一行数据的时候使用LIMIT 1
当只需要查询某一列数据的时候不要用select *,应该用select “字段名”…
应该养成要什么就取什么的习惯
2. 给搜索字段建立索引
当然建立索引需要注意的地方也很多,比如索引字段类型应该是数字类型,而最好不是字符类型,索引应该建立在不经常修改数据的字段上,不要在一个表中过多建立索引等
3. 在进行join查询的时候,要考虑join的两个字段是否是被索引过的,是否是同种类型,并且字符集也应该相同,这样MySQL就能启动优化join的SQL语句机制。
4. 查询的时候不要使用mysql自带的函数,如RAND( ),CURDATE ( )等,应该在程序中实现这些功能,以减轻MySQL的负担
5. 为每一个表设置一个ID
我们应该为数据库中的每张表都设置一个ID作为其主键,而且最好的是一个INT型(UNSIGNED)并设为AUTO_INCREMENT,并注意如果使用字符类型的字段作为主键会引起性能下降。如果是关联表的话,可以另当别论,即两个表互相关联,则这两个表的原来的主键共同组成关联表的主键
6. 当知道字段确定的内容时,如性别字段只有‘男’,‘女’两种内容,则应该用ENUM类型,而不应该用其他的类型
7. 当确定字段中内容的长度时,应该使用char类型,而不应该使用varchar,具体差别可以查阅MySQL API说明文档中char与varchar的区别
8. 尽可能的使用NOT NULL
当你知道某个字段不可能或者不允许为NULL时,应该加上NOT NULL标志,NULL与空(Empty)的区别?NULL也占用空间吗?这是值得探究的问题
9. 在程序中使用Prepared Statements来包裹你的SQL语句,MySQL只会解析一次这些SQL语句,而分开的话MySQL将多次解析SQL语句,并且这样据说也较为安全些(具体是什么地方安全些有考证)。
10. 把IP地址存成UNSIGNED INT
毋庸置疑字段类型是数字类型的比是字符类型的要好,这个好最主要就是体现在性能上。所以存储IP地址的时候可以将IP也存成数字类型的。主要用到两个函数,第一个是将字符串IP转换成整形:INET_ATON(),第二个是将整形转化成一个字符串IP:INET_NTOA()。举例使用如下:
Insert into test values (inet_aton(‘192.168.21.111’));
Insert into test values (inet_aton(‘127.6.52.230’));
Select inet_ntoa(ip) from test;
11. 固定长度的表会更快
这个概念我第一次听说,一个表很不容易全部做到固定长度(特殊需求除外),这里固定长度的表是指表中没有Varchar,Text,Bolb类型,只要包含了其中一个类型就不是固定长度的表。由于字段都是固定长度的,所以查找的时候容易计算出一个数据库的偏移量,但是副作用就是会浪费一些存储空间。
12. 拆分大的Delete或insert语句
按照我的理解,这个概念应该是很有用的,当一个网站的访问量很大的时候,如作业系统在上课的时候,如果有一个操作是插入或者删除过多的信息。这个过程需要锁表,而在这个过程执行的时间内,会累积大量的访问线程/进程,数据库链接等,一不小心服务器就可能出现宕机。
13.字段的数据类型的长度要在允许的范围内尽可能的小,因为这将占用更少的存储空间,并将获取更好的性能。