1.优化Limit
原因:limit10000,10 查询的时候会查出10010条数据,然后舍弃前面10000条 返回10条
优化方案:记录上次查询的最后一个id值9999,然后使用sql语句select * from table where id>9999 limit10
3.用in 代替 or
对于连续的数值 能用 between 就不用or
4.尽量避免使用order by
5.避免 select *
7.注意区分 exists in
select * from 表A where id in (select id from 表B)`
上面的语句相当于:
`select * from 表A where exists(select * from 表B where 表B.id=表A.id)
in 内层表先被访问 适合外表大 内表小的
exists(外层表为驱动表) 外层表先被访问 适合外表小 内表大的
8.禁止不必要的order by排序
如果我们对结果没有排序的要求,就尽量少用排序;
如果排序字段没有用到索引,也尽量少用排序;
mysql会对group by字段进行排序,可以使用
SELECT goods_id,count(*) FROM t GROUP BY goods_id ORDER BY NULL 禁止排序
9.union和union all
union:会对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序(需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟)。
union all:对两个结果集进行并集操作,包括重复行,不会对结果进行排序
明确不重复的时候,用union all
10.将多次插入换成批量Insert插入
INSERT INTO t(id, name) VALUES(1, 'aaa');`
`INSERT INTO t(id, name) VALUES(2, 'bbb');`
`INSERT INTO t(id, name) VALUES(3, 'ccc');`
—>
`INSERT INTO t(id, name) VALUES(1, 'aaa'),(2, 'bbb'),(3, 'ccc');
11.尽量使用数字型字段
若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能。引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
12.join的优化
13group by的优化
1.创建索引(B+树 快)
2.避免使用select 列出需要查询的列
3.水平拆分(分表,分库,分库分表)和垂直拆分
只分表:
将db库中的user表拆分为2个分表,user_0和user_1,这两个表还位于同一个库中。适用场景:如果库中的多个表中只有某张表或者少数表数据量过大,那么只需要针对这些表进行拆分,其他表保持不变。
只分库:
将db库拆分为db_0和db_1两个库,同时在db_0和db_1库中各自新建一个user表,db_0.user表和db_1.user表中各自只存原来的db.user表中的部分数据。
分库分表:
将db库拆分为db_0和db_1两个库,db_0中包含user_0、user_1两个分表,db_1中包含user_2、user_3两个分表。下图演示了在分库分表的情况下,数据是如何拆分的:假设db库的user表中原来有4000W条数据,现在将db库拆分为2个分库db_0和db_1,user表拆分为user_0、user_1、user_2、user_3四个分表,每个分表存储1000W条数据。
垂直拆分:
这里的垂直拆分,指的是将一个包含了很多表的数据库,根据表的功能的不同,拆分为多个小的数据库,每个库包含部分表。下图演示将上面提到的库,拆分为db_user库和db_product库。
另一种说法就是你一个表中的字段(就是列)很多,你每次查询都把不是很需要的列查出来不是浪费性能的吗,你用的不是很多的列可以把它们放到另一个表中。。。。你可以在新建的表中加上id什么的,这样你查询到的时候就能查到了啊。