为查询优化你的查询
文章插图
大多数的MySQL服务器都开启了查询缓存 。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的 。当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了 。
这里最主要的问题是,对于程序员来说,这个事情是很容易被忽略的 。因为,我们某些查询语句会让MySQL不使用缓存 。请看下面的示例:
// 查询缓存不开启$r = mysql_query("SELECT username FROM user WHEREsignup_date >= CURDATE()");
// 开启查询缓存$today = date("Y-m-d");$r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");
上面两条SQL语句的差别就是 CURDATE(),MySQL的查询缓存对这个函数不起作用 。所以,像 NOW() 和 RAND() 或是其它的诸如此类的SQL函数都不会开启查询缓存,因为这些函数的返回是会不定的易变的 。所以,你所需要的就是用一个变量来代替MySQL的函数,从而开启缓存 。文章插图
学会使用EXPLAIN
使用EXPLAIN关键字可以让你知道MySQL是如何处理你的SQL语句的 。
select id, title, cate from news where cate = 1
发现查询缓慢,然后在cate字段上增加索引,则会加快查询当只要一行数据时使用LIMIT 1
当你查询表的有些时候只需要一条数据,请使用 limit 1 。
正确的使用索引
索引并不一定就是给主键或是唯一的字段 。如果在你的表中,有某个字段你总要会经常用来做搜索、拍下、条件,那么,请为其建立索引吧 。
不要ORDER BY RAND()
效率很低的一种随机查询 。
避免SELECT *
从数据库里读出越多的数据,那么查询就会变得越慢 。并且,如果你的数据库服务器和WEB服务器是两台独立的服务器的话,这还会增加网络传输的负载 。必须应该养成一个需要什么就取什么的好的习惯 。
使用 ENUM 而不是 VARCHAR
ENUM 类型是非常快和紧凑的 。在实际上,其保存的是 TINYINT,但其外表上显示为字符串 。这样一来,用这个字段来做一些选项列表变得相当的完美 。
如果你有一个字段,比如“性别”,“国家”,“民族”,“状态”或“部门”,你知道这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是 VARCHAR 。
文章插图
使用 NOT NULL
除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOT NULL 。这看起来好像有点争议,请往下看 。
首先,问问你自己“Empty”和“NULL”有多大的区别(如果是INT,那就是0和NULL)?如果你觉得它们之间没有什么区别,那么你就不要使用NULL 。(你知道吗?在 Oracle 里,NULL 和 Empty 的字符串是一样的!)
不要以为 NULL 不需要空间,其需要额外的空间,并且,在你进行比较的时候,你的程序会更复杂 。当然,这里并不是说你就不能使用NULL了,现实情况是很复杂的,依然会有些情况下,你需要使用NULL值 。
下面摘自MySQL自己的文档
“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”
IP地址存成 UNSIGNED INT
很多程序员都会创建一个 VARCHAR(15) 字段来存放字符串形式的IP而不是整形的IP 。如果你用整形来存放,只需要4个字节,并且你可以有定长的字段 。而且,这会为你带来查询上的优势,尤其是当你需要使用这样的WHERE条件:IP between ip1 and ip2 。
我们必需要使用UNSIGNED INT,因为 IP地址会使用整个32位的无符号整形
固定长度的表会更快
如果表中的所有字段都是“固定长度”的,整个表会被认为是 “static” 或 “fixed-length” 。例如,表中没有如下类型的字段: VARCHAR,TEXT,BLOB 。只要你包括了其中一个这些字段,那么这个表就不是“固定长度静态表”了,这样,MySQL 引擎会用另一种方法来处理 。
固定长度的表会提高性能,因为MySQL搜寻得会更快一些,因为这些固定的长度是很容易计算下一个数据的偏移量的,所以读取的自然也会很快 。而如果字段不是定长的,那么,每一次要找下一条的话,需要程序找到主键 。
推荐阅读
- 数据在网络中是如何传输的
- Java高级用法,写个代理侵入你 ?
- C|数据存储地址与字节偏移、数据索引
- Python爬虫实战,pyecharts模块,Python实现中国地铁数据可视化
- Mysql数据库tinyint,int,bigint,char,varchar究竟用哪个?
- 笔记本|DNF:沾了2个职业的光!3级buff称号成胚子价,这些职业太幸福
- 福鼎白茶4个等级哪个好,福鼎白茶个等级
- Win下部署多个MySQL数据库实例
- APP渗透 | 解决安卓7+无法抓取数据包问题
- 网络协议之:基于UDP的高速数据传输协议UDT