select * from pay_history
select name,pay_time,order_no,money from pay_history
节省资源、网络开销
可能会用到覆盖索引,减少回表,提高查询效率
select name,pay_time,order_no,money from pay_history where money > 100 or name like '李%'
select name,pay_time,order_no,money from pay_history where money >100
union all
select name,pay_time,order_no,money from pay_history where name like '李%'
使用or会导致索引失效,从而导致全表扫描。
主键(id):优先使用int、tinyint
性别(sex):女(0)男(1),mysql推荐使用tinyint
因为引擎在处理查询和连接时会逐个比较字符串中每一个字符
数值类型比较一次就可以了
字符会降低查询和连接的性能,并会增加存储开销
select name,pay_time,order_no,money from pay_history where money is not null
select name,pay_time,order_no,money from pay_history where money > 0
如果mysql优化器发现,走索引比不走索引成本高的时候,就会放弃索引,这些条件!=,<>,is null,is not null
经常会让索引失效;
一般情况下,查询成本高时优化器就会放弃索引;
如果把null
值,换成默认值,很多时候让走索引成为可能,同时思路也相对清晰一些;
select name,pay_time,order_no,money from pay_history where money != 100
select name,pay_time,order_no,money from pay_history where money <> 100
使用!=
和 <>
很可能让索引失效;
应避免在where子句中使用!=
、<>
操作符,否则会进行全表扫描;
如果实在没办法,可以适当使用。
三种连接如果结果集相同,优先使用inner join,如果使用left join,左表尽量使用小表;
先分组,再过滤
select name,pay_time,order_no,sum(money) from pay_history group by name having name like '李%' or name like '张%';
先过滤,再分组
select name,pay_time,order_no,sum(money) from pay_history where name like '李%' or name like '张%' group by name;
在分组前,将结果集过滤完毕。
binlog
快速恢复;select name,pay_time,order_no,sum(money) from pay_history WHERE DATE_ADD(pay_time,INTERVAL 7 DAY) >=NOW();
select name,pay_time,order_no,sum(money) from pay_history WHERE pay_time >= DATE_ADD(=NOW(),INTERVAL 7 DAY);
select name,pay_time,order_no,sum(money) from pay_history WHERE name like '%李';
select name,pay_time,order_no,sum(money) from pay_history WHERE name like '%李%';
select name,pay_time,order_no,sum(money) from pay_history WHERE name like '李%';
如果必须使用模糊查询,避免使用全模糊查询,即like '李%'
,是会使用索引的;
左模糊‘%李’
无法直接使用索引;
GROUP BY
和ORDER BY
子句时;