基本优化:在经常使用排序的字段加索引,like查询前面不加%等等,这里就不细说
我们这里主要讨论的是稍微高级一点的查询优化:
1.分页查询
在分页起始页越来越大的时候,查询速度可能会越来越慢
select * from table order by id desc limit 1000000,10
上面的语句是比较经常使用的sql语句,这个语句在数据量不高的时候速度还是可以用的
但是在数据量分页数越来越大速度会非常的慢.这时有一种优化方案:
SELECT * FROM `table` WHERE id>(SELECT id FROM `table` order by id limit 700000-1,1) order by id limit 0,10
这种方案大致可以节省的时间大概是看字段数多少和大小,原理是因为查询是通过id排序,这时我们使用子查询,查询其中我们需要的一个值(注意这里需要先减1才能查询的是我们改造前的数据),然后id大于他的就是我们想要的分页.为什么快呢,因为前面条件是select * 哪怕分页也是会进行查询的,所以先把不需要的查询*替换为id作为标识,这时就节省了一部分资源,速度也相对变快了
2.数据库表的字段类型
-
ENUM 类型是非常快和紧凑的。在实际上,其保存的是 TINYINT,但其外表上显示为字符串。这样一来,用这个字段来做一些选项列表变得相当的完美。
如果你有一个字段,比如“性别”,“国家”,“民族”,“状态”或“部门”,你知道这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是 VARCHAR。
-
除非你有一个很特别的原因去使用 NULL 值,你应该总是让你的字段保持 NOT NULL。这看起来好像有点争议,请往下看。
首先,问问你自己“Empty”和“NULL”有多大的区别(如果是INT,那就是0和NULL)?如果你觉得它们之间没有什么区别,那么你就不要使用NULL。(你知道吗?在 Oracle 里,NULL 和 Empty 的字符串是一样的!)
不要以为 NULL 不需要空间,其需要额外的空间,并且,在你进行比较的时候,你的程序会更复杂。 当然,这里并不是说你就不能使用NULL了,现实情况是很复杂的,依然会有些情况下,你需要使用NULL值。
3.在合适的时候新增工具表和合适的引擎
比如一个表中的数据很大,在你经常使用某个字段进行排序的时候,可以把id和其他的一些字段提出来放入新表中,然后使用第一个分页查询优化方法,进行查询,如果还慢可以考虑换搜索引擎