,应尽量避免全表扫描,首先应考虑在where及orderby涉及的列上建立索引。,否则将导致引擎放弃使用索引而进行全表扫描,如:selectidfromtwherenumisnull可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:selectidfromtwherenum=!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。,否则将导致引擎放弃使用索引而进行全表扫描,如:selectidfromtwherenum=10ornum=20可以这样查询:selectidfromtwherenum=10unionallselectidfromtwherenum=,否则会导致全表扫描,如:selectidfromtwherenumin(1,2,3)对于连续的数值,能用between就不要用in了::selectidfromtwherenamelike‘%abc%’若要提高效率,可以考虑全文检索。,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:selectidfromtwherenum=***@num可以改为强制查询使用索引:selectidfromtwith(index(索引名))wherenum=***@,这将导致引擎放弃使用索引而进行全表扫描。如:selectidfromtwherenum/2=100应改为:selectidfromtwherenum=100*,这将导致引擎放弃使用索引而进行全表扫描。如:selectidfromtwheresubstring(name,1,3)=’abc’–name以abc开头的idselectidfromtwheredatediff(day,createdate,’2005-11-30′)=0–‘2005-11-30’生成的id应改为:selectidfromtwherenamelike‘abc%’selectidfromtwherecreatedate>=’2005-11-30′andcreatedate<’2005-12-1′“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。,如需要生成一个空表结构:selectcol1,col2into#tfromtwhere1=0这类代码不会返回任何结果集,但是会消耗系统资源的,应改
《sql百万级数据库优化方案》 来自淘豆网m.daumloan.com转载请标明出处.