mysql基本语句优化
-
mysql执行顺序
1、执行FROM语句 2、执行ON过滤 3、添加外部行 4、执行where条件过滤 5、执行group by分组语句 6、执行having 7、select列表 8、执行distinct去重复数据 9、执行order by字句 10、执行limit字句
-
优化关联查询
对于关联查询来说,不需要在第一张表里建立索引,因为第一张表的联合查询不走索引,尽可能的通过子查询缩小范围,在通过建立第二张表,第三张表索引来提高效率
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-67Pf1lLM-1593478778515)(file://C:\Users\Lenovo\Documents\学习文档\高性能mysql读后\pic\关联.jpg)]
对于子查询,优化方式就是尽可能得将子查询改成关联查询,原因:子查询需要创建和填充临时表,而子查询中创建得临时表是没有任何索引得,mariandb修复了这个问题
group by 不走索引得原因:
- 如果GROUP BY 的列没有索引,产生临时表.
- 如果GROUP BY时,SELECT的列不止GROUP BY列一个,并且GROUP BY的列不是主键 ,产生临时表.
- 如果GROUP BY的列有索引,ORDER BY的列没索引.产生临时表.
- 如果GROUP BY的列和ORDER BY的列不一样,即使都有索引也会产生临时表.
- 如果GROUP BY或ORDER BY的列不是来自JOIN语句第一个表.会产生临时表.
- 如果DISTINCT 和 ORDER BY的列没有索引,产生临时表.
如果避免了以上几种情款,索引生效得情况下可以利用子查询将关联表缩小后,在进行关联,如下:
--原sql
SELECT
a.no,
SUM(a.aa) total,
b.bb
FROM
A a
INNER JOIN
B b
ON a.no=b.no
GROUP BY a.no
-- 优化SQL一:
SELECT
a.no,
a.total,
b.bb
FROM
(SELECT no,SUM(aa) total FROM A GROUP BY no) a
INNER JOIN
B b
ON a.no=b.no
-- 优化SQL二:
SELECT
a.no,
a.total,
b.bb
FROM
B b,
(SELECT no,SUM(aa) total FROM A GROUP BY no) A a
WHERE
a.no=b.no
其实这两种方式优化是一个道理,只是写法不同而已