您的位置:首页 > 数据库 > MySQL

mysql优化

2016-12-07 14:59 274 查看
mysql知识库

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语句的非索引项或者有计算表达式都将降低查询速度;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: