1、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where
及 order by
涉及的列上建立索引。
- 实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
- 上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行
INSERT
、UPDATE
和DELETE
。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。 - 建立索引会占用磁盘空间的索引文件。所以要慎用。
- 一个表的索引数最好不要超过6个,若太多则应考虑一些
不常使用
到的列上建的索引是否有必要。 - 并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
2、应尽量避免
在where
子句中对字段进行null 值判断
,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
3、应尽量避免
在 where
子句中使用!=
或<>
操作符,否则将引擎放弃使用索引而进行全表扫描。
SELECT id FROM article WHERE type_name='2' OR type_name='3';
可以这样查询:
SELECT id FROM article WHERE type_name='2'
UNION ALL
SELECT id FROM article WHERE type_name='3';
ps:但是本人的查询结果显示,耗时并没有太大差别,可能是本人的数据库数据量不够的原因吧。。。
4 、字段类型使用方面
- 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。 这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
- 尽可能的使用
varchar
代替char
,因为首先变长字段存储空间小,可以节省存储空间, 其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
5、任何地方都不要使用select * from t
,用具体的字段列表代替“*”
,不要返回用不到的任何字段。