1首先考虑查询的表的字段是否比较多,如果不多,直接设计冗余字段,将多表查询变单表查询。
2如果查询的字段比较多,就需要对sql语句进行优化了,通过explain关键字加在慢sql前执行看是否走的索引,如果没有走索引就创建索引。
通过查看结果中的type
type=ALL,全表扫描,MySQL遍历全表来找到匹配行**
type=index,索引全扫描,MySQL遍历整个索引来查询匹配行,并不会扫描表
type=range,索引范围扫描,常用于<、<=、>、>=、between等操作
type=ref,使用非唯一索引或唯一索引的前缀扫描,返回匹配某个单独值的记录行
type=eq_ref,类似ref,区别在于使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配
type=const/system,单表中最多有一条匹配行,查询起来非常迅速,所以这个匹配行的其他列的值可以被优化器在当前查询中当作常量来处理
type=NULL,MySQL不用访问表或者索引,直接就能够得到结果
如果发现分析出来的表type 为All ,我们首先想到这个表没加索引,我们给他加上 。
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
mysql引擎放弃使用索引而进行全表扫描的几种情况(索引失效):
1模糊查询时,通配符放到左边的时候,会导致索引失效
比如 like ''%keyword%''会索引失效, like “keyword%”索引不会失效
2列是字符串类型,无论是不是字符串数字一定要用 “ ' ”引号 把它包括起来,否则索引失效
expain select * from dept where dname=’111’;
3注意:not in 、not exist、!=、< >、like "%_",以及in(select子句) 会导致索引失效
4查询的条件列进行过运算或处理,不会走索引,因为不确定计算后的值是什么
如: where DATE_FORMART(start_time,’%y-%m-%d’) = “21-2-23” 不会走索引
5查询null值如: where name is null 不会走索引,可以去null设定为 0 来代替。
6or会导致索引失效
select * from dept where dname=’xxx’ or loc=’xx’; //不能使用索引,它没办法从两个索引树种去检索
7如果mysql认为使用全表扫描要比使用索引快,则不使用索引,比如表里面只有一条记录
添加索引的方式
创建索引的方式
1创建普通索引的方式
create index 索引名 on 表 (列1,列名2,...);
2修改表添加索引
alter table 表名 add index 索引名(列1,列名2,..);
案例
create table aaa(id int unsigned,name varchar(32)); // 创建表aaa
create index Iname on aaa(name); // 给表名aaa的name字段创建索引名为Iname
alter table aaa add index index1(name);3创建组合索引
CREATE INDEX PersonIndex
ON Person (LastName, FirstName);