首先对于关系型数据库 MySQL Oracle
非关系型数据库
说说Mysql 用的比较多,很多人提到优化 嘴边就会挂一句 或者联想到 索引,难道加了索引就有用? 还真有用,但是关键你得会用,不恰当的使用会导致插入数据时变慢,当然插入数据的需求不多时可能没发觉,当发觉后就晚了!
首先介绍下 查询类型
子查询、连接查询、集合查询和分页查询
子查询:将一个查询包含到另一个查询当中。
1.不相关子查询:由里向外,即先执行子查询,子查询的结果用于建立父查询的条件。
2.相关子查询:先由外向里再向外,即先执行父查询,子查询再利用父查询的传值作为条件,最后父查询再利用子查询的结果作为查询条件返回最终结果。
连接查询:合并多个数据表的列。
1.内连接
1.1等值连接:关联条件的运算符是用等号来连接的。
1.2不等值连接:连接条件是出等号之外的操作符
1.3自然连接:两张表中寻找那些数据类型和列名相同的字段,然后自动地将它们连接起来,并返回所有符合条件的结果。
2.外连接
2.1左连接:以左表为准,即使右边没有满足连接条件对应的记录,左边也会出现在查询结果中,右边以空值出现。如果左边的表是右边的一方,那么返回的行数不一定和左表的记录数相等;
2.2右连接:以右表为准,即使右边没有满足连接条件对应的记录,右边也会出现在查询结果中,左边以空值出现。如果右边的表是左边的一方,那么返回的行数不一定和右表的记录数相等;
3.自连接:将一张表当多张表来连接。
4.交叉连接:也称笛卡尔积,返回的数据行数等于第一张表中符合查询条件的行数乘以第二张表中符合条件的数据行数。
集合查询:合并多个数据表中的行。包括union(并集)、intersect(交集)、和minus(差集)。
1.union:将两个以上的表的类似的查询结果叠成不同行返回,相同的内容只返回一行。
2.union all:将两个以上的表的类似的查询结果全部叠成不同行返回,也返回重复行。
3.intersect:返回两张表中相同的信息。
4.minus:返回两张表中不相同内容的信息。
首先执行了一条查询动态的sql 未改造前的sql 查询结果
14.52秒 实在是不能忍受,
但是呢 ,遇到事情不要慌 ,首先检查索引,发现 索引有,但是没有效果 这是为什么呢?
再打开EXPLIAN 执行计划一看 ,最后一个左连接的表没有走索引,而且全表扫描了
终于发现两张表的关联的 openid uuid字段 字符类型不一致,两个表 join 的字段 字符集不是同一个类型所以是不会走索引的
原SQL贴出来
EXPLAIN SELECT
wdr.id,
wdr.app_id,
wdr.openid,
wdr.type,
wdr.times,
wdr.remark,
wdr.created_at,
wdr.action user_action,
wv.real_name,
wv.nickname,
wv.avatar,
wcu.visitor_code
FROM
wk_dynamic_record wdr
LEFT JOIN wk_visitor wv ON wv.openid = wdr.openid
LEFT JOIN wk_card_user_visitor_record wcu ON wcu.open_id = wdr.openid
AND wcu.user_uuid = wdr.user_uuid
WHERE
wdr.user_uuid = '78b03850'
AND wdr.openid != 'omRDn5WVak9St7W9O3UVl9KLACSw'
ORDER BY
created_at DESC
索引问题解决了 再次查询速度显示为
恩这就对了!如果不是这个问题其实还可以改sql 不用左连接的方式。