1.尽可能不使用OR,因为OR会导致数据库引擎放弃索引进行全表扫描。我们应该使用UNION
比如我们想要查询17岁和70岁的人,他就会有不同的查询方式
优化前:
select * from a where age =17 OR age =70
优化后:
SELECT * FROM a WHERE age = 17 UNION SELECT * FROM a WHERE age = 70
2.查询时where语句越左边放越苛刻的条件,因为Mysql是从左到右执行的,先过滤到多的数据,后面只是在少量数据中查询
举例: 假如是初中生,查询年龄是15岁,并且性别是男生。一般性别是55开或者46开,一般年龄差距在三岁之间,差不多该岁数会占三分之一。很明显根据年龄能排除更多的数据
select * from student where age = 15 and sex = '男'
3.避免进行空值判断,尽可能在插入时进行初值赋予,查询时判断初值
优化前:
select * from student where score is null
优化后:
insert into student(name,....,score) values('小明',....,0)
select * from student where score = 0
4.在多表查询时,使用表别名,避免拿着列名去各个表匹配
select s.*,t.* from student s,teacher t where s.tid = t.id
5.模糊搜索尽量避开头搜索
select * from student where name like '王%'
6.尽量不适用select *
①减少不必要字段的查询,多余的字段只会浪费内存,给CPU增加不必要的麻烦,在网络交互时,也会增加麻烦。
②Mysql在处理大字段时(text,longtext,blob等等),会先把超出的数据序列化到另外一个地方,如果我们查询的字段中有不需要的字段,就会出现多一次I/O操作的情况。
③select *直接使得此次查询失去覆盖索引的可能性,简单的介绍一下覆盖索引:在我们进行查询时,会有一些索引,也就是我们where后面的条件,我们查询的规则时,现根据条件,查询符合规则的索引列,然后再查到想要的列的数据。但是当我们想要的数据和索引列相同时,就会舍去第二次那个查询数据的过程,提高我们查询的效率。
7.多表联查时,小表放前,大表放后,与2性质相同。Mysql都是从左向右查的,第一个表需要扫描全表,但是后续的表,会根据条件来查询部分数据。
8.避免使用uuid,尽可能使用自增整型当作主键。当使用uuid时,mysql会自己创建一个隐藏的自增整型。我们数据库的资源是很宝贵的,不要导致出现多余的字段。