优化

10个高级的SQL查询技巧

Sql, CTEs, SQL Optimization, 优化, Sql优化

随着数据量持续增长,对合格数据专业人员的需求也会增长。具体而言,对SQL流利的专业人士的需求日益增长,而不仅仅是在初级层面。 因此,Stratascratch的创始人Nathan Rosidi以及我觉得我认为10个最重要和相关的中级到高级SQL概念。 那个说,我们走了! 常见表表达式(CTEs) # 如果您想要查询子查询,那就是CTEs施展身手的时候 - CTEs基本上创建了一个临时表。 使用常用表表达式(CTEs)是模块化和分解代码的好方法,与您将文章分解为几个段落的方式相同。 请在Where子句中使用子查询进行以下查询。 SELECT name, salary FROM People WHERE NAME IN ( SELECT DISTINCT NAME FROM population WHERE country = "Canada" AND city = "Toronto" ) AND salary >= ( SELECT AVG( salary ) FROM salaries WHERE gender = "Female") 这似乎似乎难以理解,但如果在查询中有许多子查询,那么怎么样?这就是CTEs发挥作用的地方。 with toronto_ppl as ( SELECT DISTINCT name FROM population WHERE country = "Canada" AND city = "Toronto" ) , avg_female_salary as ( SELECT AVG(salary) as avgSalary FROM salaries WHERE gender = "Female" ) SELECT name , salary FROM People WHERE name in (SELECT DISTINCT FROM toronto_ppl) AND salary >= (SELECT avgSalary FROM avg_female_salary) 现在很清楚,Where子句是在多伦多的名称中过滤。如果您注意到,CTE很有用,因为您可以将代码分解为较小的块,但它们也很有用,因为它允许您为每个CTE分配变量名称(即toronto_ppl和avg_female_salary) ...

20个SQL优化方法

Sql, Optimization, SQL Optimization, 优化, Sql优化

查询SQL尽量不要使用select *,而是具体字段 # 反例 SELECT * FROM user 正例 SELECT id,username,tel FROM user 理由 节省资源、减少网络开销。 可能用到覆盖索引,减少回表,提高查询效率。 注意:为节省时间,下面的样例字段都用*代替了。 避免在where子句中使用 or 来连接条件 # 反例 SELECT * FROM user WHERE id=1 OR salary=5000 正例 使用union all SELECT * FROM user WHERE id=1 UNION ALL SELECT * FROM user WHERE salary=5000 - 分开两条SQL写 SELECT * FROM user WHERE id=1 SELECT * FROM user WHERE salary=5000 理由 使用or可能会使索引失效,从而全表扫描; 对于or没有索引的salary这种情况,假设它走了id的索引,但是走到salary查询条件时,它还得全表扫描; 也就是说整个过程需要三步:全表扫描+索引扫描+合并。如果它一开始就走全表扫描,直接一遍扫描就搞定; 虽然mysql是有优化器的,出于效率与成本考虑,遇到or条件,索引还是可能失效的; 尽量使用数值替代字符串类型 # 正例 ...