1)mysql的链接查询
mysql的六种链接查询
a) 交叉链接 (cross join) select * from A,B(,C) 或者select * from A cross join B (cross join C) 没有任何关联条件,结果是笛卡尔积,结果集会很大没有意义,很少使用
b) 内连接 select * from A,B where A.id = B.id 或者 select * from A inner join B on A.id = B.id 查询多表同时符合某种条件的数据记录集合
内连接分为三种:
等值链接 on A.id = B.id
不等值链接 on A.id > B.id
自链接 select * from A T1 inner join A T2 on T1.id = T2.pidc) 外连接 左外连接:left outer join 以左表为主表按照on 后的关联条件匹配右表,没有匹配到的用null填充,可以简写成left join ,右外链接相似,可以简写成 right join
d) 联合查询 select * from A union select * from B union select * from C ..... 把多个结果集集中在一起,union前的结果为基准,需要注意的是联合查询的列数要相等,相同的记录会合并,,如果使用union all ,不会合并重复的记录行
e) 全连接 MySQL不支持全连接,但是可以使用 left join ,union ,right join代替
select * from A left join B on B.id = B.id union select * from A right join B on A.id = B.id
2) mysql语句的优化与分析
1)查找分析查询速度慢的原因
2)优化查询过程中的数据访问
3)优化长难的查询语句
4)优化特定类型的sql语句
分析sql查询慢的方法
1、记录慢查询日志,不要分析查询打开慢查询日志进行分析,这样比较浪费时间和精力,可以使用pt-query-digest工具与进行分析
2、show profile . set profiling = 1; 开启,服务器上执行的所有语句会检测消耗的时间,存到临时表中
show profiles 。。。。show profile for query 临时表ID
3、show status ,show status 会返回一些计数器,,show global status查看服务器级别的所有计数,,有时根据这些计数,可以猜测出哪些操作代价比较高或者消耗时间多
4、show processlist 观察是否有大量线程处于不正常的状态或者特征
5、explain,,分析单条sql语句
优化查询过程中的数据访问
1、查询数据太多导致性能下降,,是否有查询太多不必要的列或者行,,避免使用select * 会让优化器无法完成索引覆盖扫描的优化,,,用explain进行分析,看是否扫描了大量的行,返回少数行,,是否命中了预期的索引
2、改变数据表的结构,修改数据范式,,允许字段冗余
3、具体分析是用一个复杂的查询还是多个简单查询