在一个千万级的数据库查寻中,如何提高查询效率?( 二 )

H. 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引 。
I. 不要写一些没有意义的查询,如需要生成一个空表结构:
select col1,col2 into #t from t where 1=0
这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样: create table #t(…)
J. 很多时候用 exists 代替 in 是一个好的选择:
select num from a where num in(select num from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=a.num)
K. 任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段 。
L. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写 。
M. 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理 。
N. 尽量避免大事务操作,提高系统并发能力 。
O、当只要一行数据时使用LIMIT 1;
当你查询表的有些时候,你已经知道结果只会有一条结果,单因为你可能需要去fetch游标,或是你也许会去检查返回的记录数 。
在这种情况下,加上LIMIT 1 可以增加性能 。这样一样, MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查找下一条符合记录的数据 。
P、千万不要ORDER BY RAND();
Q、避免SELECT *;
R、使用 ENUM 而不是 VARCHAR ?
ENUM 类型是非常快和紧凑的 。在实际上,其保存的是 TINYINT,但其外表上显示为字符串 。这样一来,用这个字段来做一些选项列表变得相当的完美 。
如果你有一个字段,比如“性别”,“国家”,“民族”,“状态”或“部门”,你知道这些字段的取值是有限而且固定的,那么,你应该使用 ENUM 而不是 VARCHAR 。
S、把IP地址存成 UNSIGNED INT
很多程序员都会创建一个 VARCHAR(15) 字段来存放字符串形式的IP而不是整形的IP 。如果你用整形来存放,只需要4个字节,并且你可以有定长的字段 。而且,这会为你带来查询上的优势,尤其是当你需要使用这样的WHERE条件:IP between ip1 and ip2 。
我们必需要使用UNSIGNED INT,因为 IP地址会使用整个32位的无符号整形
3、JAVA方面:重点内容
A.尽可能的少造对象 。
B.合理摆正系统设计的位置 。大量数据操作,和少量数据操作一定是分开的 。大量的数据操作,肯定不是ORM框架搞定的 。,
C.使用jDBC链接数据库操作数据
D.控制好内存,让数据流起来,而不是全部读到内存再处理,而是边读取边处理;
E.合理利用内存,有的数据要缓存


推荐阅读