1. MySQL中,在某些情况下,如果明知道查询结果只有一个,SQL语句中使用LIMIT 1会提高查询效率

create table t_user(  
  id int primary key auto_increment,  
  email varchar(255),  
  password varchar(255)  
);

每个用户的email是唯一的,如果用户使用email作为用户名登陆的话,就需要查询出email对应的一条记录。

SELECT * FROM t_user WHERE email=?;

上面的语句实现了查询email对应的一条用户信息,但是由于email这一列没有加索引,会导致全表扫描,效率会很低。

SELECT * FROM t_user WHERE email=? LIMIT 1;

加上LIMIT 1,只要找到了对应的一条记录,就不会继续向下扫描了,效率会大大提高。

LIMIT 1适用于查询结果为1条(也可能为0)会导致全表扫描的的SQL语句。
如果email是索引的话,就不需要加上LIMIT 1,如果是根据主键查询一条记录也不需要LIMIT 1,主键也是索引。

2. force index() 强制索引的使用

使用MySQL force index 强制索引的目的是对目标表添加最关键的索引,使其优先使用该索引筛选数据

select * from ws_shop a 
where date(create_time-interval 6 hour) > '2016-10-01 06:00:00'

如果表中的数据是百万级的,这样查询是比较慢的;虽然你有可能在字段create_time上面加了索引,但是在where条件中又破坏了索引;导致索引失效;

这是我们优化为:

select * from ws_shop a force index(create_time)
where date(create_time-interval 6 hour) > '2016-10-01 06:00:00'

3. ON DUPLICATE KEY UPDATE作用

先声明一点,ON DUPLICATE KEY UPDATE为Mysql特有语法
语句的作用,当insert已经存在的记录时,执行Update
当是一条不存在当记录,执行insert。
实际开发中存在这样当情景:首先若数据库存在某一个key对应当数据,则修改对应的记录,否则插入一条新的记录。

其用法如下:如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE操作,如果不会导致唯一值重复的问题,则执行INSERT操作。
例如,如下,当数据库存在id(主键)为100的数据时,以下两个语句的功能等效:

insert into student(id ,names , age) values(100 , "zhangsan" , 21) on duplicate update
update student set age = 21 where id = 100

4.需要遍历数据表的时候,如果数据量很大的话,慎用LIMIT

例如,想要遍历一个数据量很大的表,通常可以使用如下语句:

select * from tab_name order by id desc limit [offset],[pageSize];

这样每次查询出pageSize数量的内容,然后进行数据的处理,但如果数据表的数量很大,因为limit会遍历数据表计数,等到offset处才会查询pageSize条数据,例如pageSize=300 , 开始的时候,查询出1-300的数据,然后为301-600。。。。以此类推,但是到后面,每次查询就会是,10,000,001~10,000,300 。。。然后为10,000,301~10,000,600 .此时会严重影响查询效率,每次查询都会变得十分耗时。

可以改写为如下结构:

select * from tab_name where id < [total-pageSize*page] order by id desc limit [pageSize];