SELECT @rowno:=@rowno+1 AS rowno,a.id,a.`status`,a.reason FROM e_four_auth a,(SELECT @rowno:=0) b
(SELECT @rowno:=0) 初始化rowno ; @rowno:=@rowno+1 每行+1
2.explain 用法和结果的含义
1 inner join : SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name
交集
2 left join : SELECT * FROM TableA LEFT JOIN TableB ON TableA.name = TableB.name
A的完全集,B中能匹配的则有值,没有匹配的则null. (right left类似。不写了)
SELECT * FROM TableA LEFT JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS NULL
A中有,B中没有的
我的测试记录
这个参数会影响到执行计划在评估的时候到底使用统计数据还是进行实际的所以你访问,那么很显然如下:
具体的参数含义见官方文档:
Equality Range Optimization of Many-Valued Comparisons
这也是为什么5.7中当出现数据大量切斜的时候执行计划依然能够得到正确的执行计划。比如性别列索引,其中30行,29行为男性,1行为女性,下面是执行计划示例:
第一次使用了索引下探,第二次禁用了索引下探。可以看到第二次的执行计划中rows明显的不对,且SEX='W'的时候不应该使用索引。
大概记录接口,如果要搞明白估计要看一年。
下面是源码栈帧,可以debug 执行计划生成的时候查看 ha_innobase::records_in_range函数的调用情况,如果索引下探必然命中函数 ha_innobase::records_in_range,否则不会命中。下面是一段英文注释处于 handler::multi_range_read_info_const函数中:
下探栈帧:
navicat 结合快捷键1.ctrl+q 打开查询窗口
2.ctrl+/ 注释sql语句
3.ctrl+shift +/ 解除注释
4.ctrl+r 运行查询窗口的sql语句
5.ctrl+shift+r 只运行选中的sql语句
6.F6 打开一个mysql命令行窗口
7.ctrl+l 删除一行
8.ctrl+n 打开一个新的查询窗口
9.ctrl+w 关闭一个查询窗口
10.ctrl+d 在查询表数据界面打开一个该表结构的窗口
ctrl+q就会d出一个sql输入窗口,就可以在里面写sql了。写完sql后,直接ctrl+r就执行sql了。还有一点,写sql语句时,navicat会提示的,根代码补全差不多
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)