1、索引优化
-
过渡索引问题
对于查询为主的应用来说,索引显得尤为重要,如果没有索引,那么查找任何哪怕一条特定的数据都会进行一次全表扫描,表数据量大,则性能下降明显;但不是什么情况都飞得建索引不可,如“性别”这种只有两个值的字段没必要建索引,建索引不仅没有什么优势,还回影响更新速度,这种称为过度索引; -
is null 与is not null问题
只要列中包含有null值都将不会包含在索引中,则该列索引失效;联合索引中只要有一列含有null值,那么该列对于联合索引就是无效的,因此在数据库设计时不要让字段默认值为null; -
联合索引
由于mysql查询及排序每次只能使用一个索引,所以表中常用作限制条件的多个字段,可以考虑建立联合索引,如(area,age,salary)联合索引,其实相当于(area,age,salary)、(area,age)、(area)三个索引,这被称为最佳左前缀特性!因此,创建联合索引时,将常用作限制条件的列放在靠左边,依次递减; -
like索引问题
- select * from employee where last_name like '%cliton%’;——通配符在这个位置的查询,系统优化 器不使用last_name的索引;
- select * from employee where last_name like 'c%’;——然而,通配符这个位置查询,优化器就能利 用索引;
-
not及<>索引问题
not及<>可用来对任何逻辑运算符号取反,not包含在<>运算符中,并且都不会使用索引而进行全表扫描;not in可用not exists代替,id<>3可用id>3 or id<3代替; -
列上函数运算索引问题
不要在列上进行函数运算,这样将在每行进行运算,导致索引失效而进行全表扫描;
如:select * from users where YEAR(adddate)<2007; 改为:select * from users where adddate<‘2007-01-01’;
-
链接列索引问题
系统优化器对于链接的列索引没有使用,如下sql,基于last_name创建的索引失效!如:
select * from employss where first_name||''||last_name ='Beill Cliton’;
-
order by语句
Order by语句对要排序的列没有什么特别的限制,也可以将函数加入列(如链接或者附加等)!任何Order by语句的非索引项或者有计算表达式都将降低查询速度;