
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
{EXPLAIN | DESCRIBE | DESC}
[explain_type]
{explainable_stmt}
explain_type: {
EXTENDED
| PARTITIONS
| FORMAT = format_name
}
format_name: {
TRADITIONAL
| JSON
| TREE
}
explainable_stmt: {
SELECT statement
| DELETE statement
| INSERT statement
| REPLACE statement
| UPDATE statement
}EXPLAIN PARTITIONS生成的。为了向后兼容,仍然可以识别该语法,但现在默认启用分区输出,因此PARTITIONS关键字是多余的,已弃用。使用它会导致一个警告,并且在MySQL 8.0中从EXPLAIN语法中删除了它。TRADITIONAL,以表格的形式输出。MySQL 8.0之前有JSON和TRADITIONAL两个选择,MySQL 8.0开始增加了TREE输出格式。如果是使用JSON格式输出的话,执行计划中的NULL值将不会展示。FORMAT = TRADITIONAL 在MySQL 8.0开始,EXTENDED和PARTITIONS已废弃,只有FORMAT一个选项。SHOW COLUMNS一样展示表结构。MySQL 8.0.18开始还可以使用EXPLAIN ANALYZE语句来分析SQL语句。感兴趣的可以安装MySQL 8.0试试看。CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`user_name` varchar(40) NOT NULL DEFAULT '' COMMENT '全名',
`gender` tinyint(2) NOT NULL DEFAULT '0' COMMENT '性别',
`create_date` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8mb4 COMMENT='用户表'CREATE TABLE `user1` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`user_name` varchar(40) NOT NULL DEFAULT '' COMMENT '全名',
`gender` tinyint(2) NOT NULL DEFAULT '0' COMMENT '性别',
`create_date` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `uk_user_name` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8mb4 COMMENT='系统用户表'explain select * from user;
| 列名 | JSON格式的里面 | 含义 |
| id | select_id | SELECT 语句id |
| select_type | None | SELECT 类型 |
| table | table_name | 表名 |
| partitions | partitions | 匹配的分区信息 |
| type | access_type | 针对单表的访问方法 |
| possible_keys | possible_keys | 可能用到的索引 |
| key | key | 实际上使用的索引 |
| key_len | key_length | 实际使用到的索引长度 |
| ref | ref | 当使用索引列等值查询时, 与索引列进行等值匹配的对象信息 |
| rows | rows | 预估的需要读取的记录条数 |
| filtered | filtered | 某个表经过搜索条件过滤后剩余记录条数的百分比 |
| Extra | None | 额外的信息 |
子查询物化:子查询的结果通常缓存在内存或临时表中。
关联/相关子查询:子查询的执行依赖于外部查询。多数情况下是子查询的 WHERE 子句中引用了外部查询包含的列。
EXPLAIN SELECT * FROM `user` INNER JOIN user1 ON `user`.id = user1.id
EXPLAIN SELECT * FROM `user` WHERE id IN (SELECT id FROM user1) OR `user`.gender = 1;
EXPLAIN SELECT * FROM `user` WHERE id IN (SELECT id FROM user1)
EXPLAIN SELECT * FROM `user` union SELECT * FROM user1;
EXPLAIN SELECT * FROM `user` UNION ALL SELECT * FROM user1;
<unionM,N>:通过union查询产生的结果,M、N分别代表着执行计划id的值<derivedN>:N的值为派生表的id值。派生表可能是FROM语句中的子查询<subqueryN>:N为物化子查询的id值EXPLAIN SELECT * FROM `user` WHERE id =(SELECT id FROM user1 WHERE id = 1);EXPLAIN SELECT * FROM (SELECT id , user_name FROM user GROUP BY user_name) derived_user WHERE derived_user.id > 1;
<derived2>,表示该查询是将派生表物化之后的表进行查询的。EXPLAIN SELECT * FROM user1 WHERE user_name IN (SELECT user_name FROM `user`);
<subquery2>,说明该表 其实就是 id 为 2 对应的子查询执行之后产生的物化表,然后将 s1 和该物化表进行连接查询EXPLAIN SELECT * FROM `user` WHERE id = 1EXPLAIN SELECT * FROM `user` INNER JOIN user1 ON `user`.id = user1.id;
EXPLAIN SELECT * FROM user1 WHERE id IN (SELECT id FROM `user` WHERE user1.user_name = `user`.user_name) OR user1.id = 1;EXPLAIN SELECT * FROM `user` WHERE user_name IN (SELECT user_name FROM user1) OR user_name='name';EXPLAIN SELECT * FROM user1 WHERE user_name > '索码理'EXPLAIN SELECT id , user_name FROM user1 WHERE user_name > '索码理'EXPLAIN SELECT * FROM user1 WHERE user_name = '索码理';
40*4+2=162,跟执行计划中的结果一样,如果user_name字段允许为NULL,那么结果就变成了163。MySQL 在执行计划中输出 key_len 列主要是为了让我们区分某个使用联合索引的查询具体用了几个索引列(联合索引有最左前缀的特性,如果联合索引能全部使用上,则是联合索引字段的索引长度之和,这也可以用来判定联合索引是否部分使用,还是全部使用),而不是为了准确的说明针对某个具体存储引擎存储变长字段的实际长度占用的空间到底是占用 1 个字节还是 2 个字节。key_len 表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好。key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。EXPLAIN SELECT * FROM `user` INNER JOIN user1 ON `user`.user_name = user1.user_name WHERE `user`.user_name > 'username4';
db_test.user.user_name(数据库.表名.具体字段),表user1使用了索引idx_user_name,这表示与表user1索引idx_user_name做等值匹配的是表user中的user_name字段。
EXPLAIN SELECT * FROM `user` WHERE id > 4
EXPLAIN SELECT * FROM `user` INNER JOIN user1 ON `user`.user_name = user1.user_name WHERE `user`.user_name > 'username4';
13*0.3333≈5,满足条件的这5行再和user1表进行连接。filtered只是一个预估值,参考值不大。
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul
我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试
如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
//1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json
我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions