1、当只要一行数据时使用 LIMIT 1
当你查询表的有些时候,你已经知道结果只会有一条结果,但因为你可能需要去fetch游标,或是你也许会去检查返回的记录数。
在这种情况下,加上 LIMIT 1 可以增加性能。这样一样,MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据。
select id from user where id=1 limit 1
2、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
3、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
4、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
5、.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20
6、下面的查询也将导致全表扫描:
select id from t where name like '%abc%'
若要提高效率,尽可能使用。 like 'abc%' 不要让%出现在首要位置
7、在Join表的时候使用相同类型的列,并将其索引
如果你的应用程序有很多 JOIN 查询,你应该确认两个表中Join的字段是被建过索引的。这样,MySQL内部会启动为你优化Join的SQL语句的机制。而且,这些被用来Join的字段,应该是相同的类型的。例如:如果你要把 DECIMAL 字段和一个 INT 字段Join在一起,MySQL就无法使用它们的索引。对于那些STRING类型,还需要有相同的字符集才行。(两个表的字符集有可能不一样)
8、避免 SELECT * 因为从数据库里读出越多的数据,那么查询就会变得越慢。
9、为每张表设置一个自增ID作为主键,而且最好的是一个INT型的(推荐使用UNSIGNED),并设置上自动增加的AUTO_INCREMENT标志。然后再加一个业务id。
10、一些标示字段 建议使用 TINYINT类型。
11、垂直分割。不要一个表很多字段,或者把表里的不常用的且字段较大的字段,单独放一张表,比如商品详情字段,这样可以降低表的复杂度和字段的数目,从而达到优化的目的。
12、拆分大的 DELETE
如果你需要去执行一个大的 DELETE 或 INSERT 插入,你需要非常小心,要避免你的操作让你的整个系统停止响应。因为这两个操作是会锁表的,表一锁住了,别的操作都进不来了。
所以,如果你有一个大的处理,你定你一定把其拆分,使用 LIMIT 条件是一个好的方法
DELETE FROM user ORDER BY create_date LIMIT 1;//删除最久的一条
delete from user limit 30 删除前30条
13、选择正确的存储引擎
MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好。不支持事务。
InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。他是它支持“行锁” ,于是在写操作比较多的时候,会更优秀。并且,他还支持更多的高级应用,比如:事务。
14、应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。
15、很多时候用 exists 代替 in 是一个好的选择,in 和 not in 要慎用,否则会导致全表扫描:
select num from a where num in(select num from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=a.num)