一、前言 前几天在Python铂金交流群【逆光】问了一个Pandas数据处理的问题,问题如下:请问 合并excel的两列,为空的单元格被另一列有值的替换。...【逆光】:好的,我去看看这个函数谢谢 【逆光】:我列表的两列不挨着, a b互补,我需要变成c (c 包含 a 和 b) 【Siris】:最笨的方法遍历判断呗 【逆光】:太慢了,我的数据有点多。...pandas里两列不挨着也可以用bfill。 【瑜亮老师】:@逆光 给出两个方法,还有其他的解决方法,就不一一展示了。 【逆光】:报错,我是这样写的。...就是你要给哪一列全部赋值为相同的值,就写df['列名'] = '值'。不要加方括号,如果是数字,就不要加引号。 【逆光】:我也试过,分开也是错的· 【瑜亮老师】:哦,是这种写法被替换了。...【瑜亮老师】:3列一起就是df.loc[:, ['列1', '列', '列3'']] = ["值", 0, 0] 【不上班能干啥!】:起始这行没有报错,只是警告,因为你这样操作会影响赋值前的变量。
上面的查询从分析结果看用到了PRIMARY索引,但是key_len为4,说明只用到了索引的第一列前缀。 情况三 查询条件用到了索引中列的精确匹配,但是中间某个条件未提供。 ?...情况四:查询条件没有指定索引第一列 由于不是最左前缀,索引这样的查询显然用不到索引。 ? 情况五:匹配某列的前缀字符串。 ?...此时可以用到索引,如果通配符%不出现在开头,则可以用到索引,但根据具体情况不同可能只会用其中一个前缀. 情况六:范围查询 ? 范围列可以用到索引(必须是最左前缀),但是范围列后面的列无法用到索引。...这里特别要说明MySQL一个有意思的地方,那就是仅用explain可能无法区分范围索引和多值匹配,因为在type中这两者都显示为range。...看起来是用了两个范围查询,但作用于emp_no上的“BETWEEN”实际上相当于“IN”,也就是说emp_no实际是多值精确匹配。可以看到这个查询用到了索引全部三个列。
上面的查询从分析结果看用到了PRIMARY索引,但是key_len为4,说明只用到了索引的第一列前缀。 情况三:查询条件用到了索引中列的精确匹配,但是中间某个条件未提供 ?...情况四:查询条件没有指定索引第一列 ? 由于不是最左前缀,索引这样的查询显然用不到索引。 情况五:匹配某列的前缀字符串 ? 此时可以用到索引,但是如果通配符不是只出现在末尾,则无法使用索引。...(原文表述有误,如果通配符%不出现在开头,则可以用到索引,但根据具体情况不同可能只会用其中一个前缀) 情况六:范围查询 ? 范围列可以用到索引(必须是最左前缀),但是范围列后面的列无法用到索引。...看起来是用了两个范围查询,但作用于emp_no上的“BETWEEN”实际上相当于“IN”,也就是说emp_no实际是多值精确匹配。可以看到这个查询用到了索引全部三个列。...选择性还不错,但离0.9313还是有点距离,那么把last_name前缀加到4: ?
Mysql目前不支持函数索引,但是能对列的前面某一部分进行索引,例如标题title字段,可以只取title的前10个字符进行索引,这个特性可以大大缩小索引文件的大小,但前缀索引也有缺点,在排序Order...匹配最左前缀 上表中的索引可用于查找所有姓为 Allen 的人,即只使用索引的第一列。 匹配列前缀 只匹配某一列的值的开头部分。例如上表的索引可用于查找所有以 J 开头的姓的人。...这里也只使用了索引的第一列。 匹配范围值 例如上表中的索引可用于查找姓在 Allen 和 Barrymore 之间的人。这里也只使用了索引的第一列。...精确匹配某一列并范围匹配另外一列 上表的索引也可用于查找所有姓为 Allen ,并且名字是字母 K 开头(比如 Kim 、 Karl 等)的人。...即第一列 last_name 全匹配,第二列 first_name 范围匹配。 只访问索引的查询 B-Tree 通常可以支持“只访问索引的查询”,即查询只需要访问索引,而无须访问数据行。
在上文中,我们都是假设索引只引用了单个的列,实际上,MySQL中的索引可以以一定顺序引用多个列,这种索引叫做联合索引,一般的,一个联合索引是一个有序元组,其中各个元素均为数据表的一列,实际上要严格定义索引需要用到关系代数...上面的查询从分析结果看用到了PRIMARY索引,但是key_len为4,说明只用到了索引的第一列前缀。 情况三:查询条件用到了索引中列的精确匹配,但是中间某个条件未提供。...情况五:匹配某列的前缀字符串。...(原文表述有误,如果通配符%不出现在开头,则可以用到索引,但根据具体情况不同可能只会用其中一个前缀) 情况六:范围查询。...有一种与索引选择性有关的索引优化策略叫做前缀索引,就是用列的前缀代替整个列作为索引key,当前缀长度合适时,可以做到既使得前缀索引的选择性接近全列索引,同时因为索引key变短而减少了索引文件的大小和维护开销
合并查询是根据一列或多列作为匹配列,将两个表左右联接在一起。有如下几种联接种类:用图形表示依次是:其中最常用的是左外部,类似于Excel的VLOOKUP功能,通过匹配列将右表的列添加到左表中。...举例有如下一张维度表,其中的列是店铺和品类,现需用店铺&品规合并为一列作为Key和事实表建立关系。因此,需要把品类扩展到品规,按照产品表中的品类与品规对应关系将品类展开。...操作步骤STEP 1 PowerQuery获取两张表后,在店铺表中,点击菜单栏主页下的合并查询。...STEP 2 在跳出的合并查询窗口,选择产品表(支持选择当前表,自己匹配自己),匹配列是品类(如果匹配列是多列,可以按住Ctrl键按照次序选择多列),联接种类选择左外部。...STEP 3 点击确定后,产品表会作为一列出现在店铺表中,点击这一列标题右侧的展开按钮,把需要展开的字段选中,去掉使用原始列名作为前缀的挑勾以保持列名的简洁性,点击确定。
1、索引的左前缀规则;索引中的列由左向右逐一匹配,如果中间某一列不能使用索引则后序列不在查询中不再被使用。...第3个和第4个查询确实包括索引的列,但(col2)和(col2,col3)不是(col1,col2,col3)的最左边的前缀。...Index Filter 的提取规则:同样从索引列的第一列开始,检查其在 where 条件中是否存在:若存在并且 where 条件仅为 =,则跳过第一列继续检查索引下一列,下一索引列采取与索引第一列同样的提取规则...;若 where 条件为 >=、>、其中的几种,则跳过索引第一列,将其余 where 条件中索引相关列全部加入到Index Filter之中;若索引第一列的where条件包含 =、>=、>、一列只包含 >=、两个条件,因此第一列可跳过,将余下的c、d两列加入到 Index Filter 中。
如果索引包含多个列,那么列的顺序也十分重要,因为Mysql只能高效的使用索引的最左前缀列,创建一个包含两个列的索引和创建两个只包含一列的索引是大不相同的。...B-Tree索引适用于全键值、键值范围或键前缀查找。其中键前缀查找只适用于最左前缀查找 全值匹配 全值匹配指的是查找列和索引中的所有列进行等值匹配。...最左前缀匹配 按照索引的定义顺序仅匹配最左侧的一列,即只使用索引的第一列。 列前缀匹配 仅匹配某一列值的开头部分。...范围匹配 (ps:范围匹配指查询条件并非是一个具体的数值,而是一个数值区间) 精确匹配+范围匹配 一般适用于多列组合索引,即第一列采用全值匹配,第二列采用范围匹配 覆盖索引 B-tree通常可以支持...术语“聚簇”表示数据行和相邻的键值(主键值)紧凑的存储在一起,因为无法同时把数据行存放在两个不同的地方,因此一个表只能有一个聚簇索引 一些数据库服务器允许选择哪个索引作为聚簇索引,但是Mysql目前内建的存储引擎都不支持此功能
当查询条件精确匹配索引的左边连续一个或几个列时,如或,所以可以被用到,但是只能用到一部分,即条件所组成的最左前缀 上面的查询从分析结果看用到了PRIMARY索引,但是key_len为4,说明只用到了索引的第一列前缀...当然,如果title的值很多,用填坑就不合适了,必须建立辅助索引 情况四:查询条件没有指定索引第一列 ? 由于不是最左前缀,这样的查询显然用不到索引 情况五:匹配某列的前缀字符串 ?...此时可以用到索引,通配符%不出现在开头,则可以用到索引,但根据具体情况不同可能只会用其中一个前缀 情况六:范围查询(由于B+树的顺序特点,尤其适合此类查询) ?...看起来是用了两个范围查询,但作用于emp_no上的“BETWEEN”实际上相当于“IN”,也就是说emp_no实际是多值精确匹配。可以看到这个查询用到了索引全部三个列。...有两种选择,建 看两个索引选择性: ? 显然选择性太低,选择性很好。 但first_name和last_name加起来长度30,有没有兼顾长度和选择性的办法?
4.1.2 匹配最左前缀 匹配最左前缀是指优先匹配最左索引列,如:上面创建的索引可用于查询条件为:(user_name )、(user_name, city)、(user_name , city , age...) 注:满足最左前缀查询条件的顺序与索引列的顺序无关,如:(city, user_name)、(age, city, user_name) 4.1.3 匹配列前缀 指匹配列值的开头部分,如:查询用户名以...4.1.4 匹配范围值 如:查询用户名以feinik开头的所有用户,这里使用了索引的第一列 ?...5.2.1 前缀索引的选择性 前缀索引要选择足够长的前缀以保证高的选择性,同时又不能太长,我们可以通过以下方式来计算出合适的前缀索引的选择长度值: (1) ?...注:第4点比较特殊一点,如果where查询条件为索引列的第一列,且为常量条件,那么也可以使用到索引 无法使用索引排序的案例 1)、sex不在索引列中 ? 2)、排序列的方向不一致 ?
我们常见的两种极端的情况 在表中除了主键没有任何的索引。 给表中的每一列都建立一个索引。 MySQL的索引是在存储引擎层来实现的,而不是在服务器层来实现的。...2、匹配最左前缀的查询 如果一个联合索引的第一列(最左索引),比如order_no跟date组成了一个联合索引,那么order_no='9878987'的查询同样可以使用该联合索引。...4、匹配范围值的查询 order_no > '9878987' and order_no < '9879131' 5、精确匹配左前列并范围匹配另外一列 比如在第二种情况下的联合索引中,我们可以精确匹配order_no...如果键值列的重复值很多,比方说性别这样的列,不管有多少行数据,那么只有两种可选的值,所以选择性就很差,这样的列上是不能使用Hash索引的。...由以上图可知,我们在建立前缀索引的时候,要尽可能的小,又要保证选择性不能太差,尽可能保持唯一。 3、联合索引 如何选择索引列的顺序 经常会被使用到的列优先。
B-Tree 索引使用于全键值、范围键值或键前缀查找(值where条件)。其中键前缀查找只适用于根据最左前缀的查找。...【2】匹配最左前缀:前面提到的索引可用于查找所有姓为 Allen 的人,即只使用索引的第一列。 【3】匹配列前缀:也可以只匹配某一列的值的开头部分。...这里也只使用了索引的第一列。 【5】精准匹配某一列并范围匹配另外一列:前面提到的索引也可用于查找姓为 Allen,并且名字是字母 K 开头的人。...即第一列 last_name 全匹配,第二列 first_name 范围匹配。 【6】只访问索引的查询:B_Tree 通常可以支持 “只访问索引的查询”,即查询只需要访问索引,而无需访问数据行。...特点:【1】对于搜索字符串中的字符都解析为正常的字符,没有特殊意义; 【2】对屏蔽字符列表中的字符串进行过滤; 【3】当记录的选择性超过50%的时候,通常被认为是不匹配; 【4】返回记录按照记录的相关性进行排序显示
适用查询: 全值匹配:是指和索引中的所有列进行匹配。 匹配最左前缀:就是多列索引的最左前缀原则。...匹配列前缀:举个例子就是,像like 'abc%'可以用到索引,而like '%abc%'就无法用到该类索引。 匹配范围值:其实就是范围查询。...但注意,当多列索引中有一列用到范围查询时,那么该列后面的索引都没法被用到。...然后尝试从3个前缀开始: ? 可以看出这个与原来的差距还是挺大的。经过尝试后,我们发现,当前缀索引长度为7时,比较合适: ? 我们还可以利用另外一种算法计算下:计算选择性。 ? 这是完整列的选择性。...然后我们看下当前缀索引分别为3,4,5,6,7时的选择性为多少: ? 这里可能有一个误区,会让我们感觉在索引前缀长度为4或5的时候,就已经足够了。那么我们再用之前的方法验证一下: ?
全职匹配的查询 在order_sn 上建立B树索引 比如 查询 订单序列号 order_sn = ‘123456’ ---- 匹配最左前缀的查询 举个例子:订单表 order_sn 没有索引...- 匹配列前缀查询 举个例子 在order_sn 上建立B树索引 order_sn like '123% ' -------------> 走索引 ---- 匹配范围值的查询 比如 order_sn...上建立索引 order_sn > '1000000' and order _sn 走索引 ---- 精确匹配左前列并范围匹配另外一列 继续使用例子...: 订单表 order_sn 没有索引, 但有个联合索引建在在 order_sn + order_date 这两个字段上 比如 精确匹配 order_sn 但 order_date是个范围查询 ---...--> 走索引 ---- 只访问索引的查询 意思就是 order_sn上有索引, 我查询的时候仅仅查询这一列(索引列),而其他的数据列我不获取。
向上取整棵子树 支持范围查询,前缀匹配查询,等值查询,可以避免排序,例如:order by index相关的列,排序会非常快,因为该列本身就是 有序存储的,查找时间复杂度 log m N(m为底,N...当联合索引中,每一列的查询频率都相差不多时,可以优先将选择率最高的列作为联合索引第一列,这样第一列即可过滤更多列,效率更高。...不能跳过前一列,匹配后一列....例如 where A = xxx and c = xxx 这时虽然可能也使用该索引,但是只能使用一部分,匹配A列,而B,C列不能匹配。 3.前缀匹配,与范围匹配。...BTree索引可以使用前缀匹配,例如 where A like "xxx%" ,使用前缀索引后,就不能使用前缀列的后续索引列。
可以先看下这篇理论介绍: MySQL|索引背后 01 MySQL的几种KEY PRIMARY KEY 有两个作用,一是约束作用(constraint),用来规范一个存储主键和唯一性,但同时也在此key...titles表的主索引为 titles表的行数为 443307 04 全列匹配 查看严格按照索引组合的查询解释: EXPLAIN SELECT *...很明显,当按照索引中所有列进行精确匹配(这里精确匹配指“=”或“IN”匹配)时,索引可以被用到。...上面的查询从分析结果看用到了PRIMARY索引,但是key_len为4,说明只用到了索引的第一列前缀。...一般两种情况下不建议建索引。 第一种情况是表记录比较少,例如一两千条甚至只有几百条记录的表,没必要建索引,让查询做全表扫描就好了。 另一种索引的选择性较低时不需要建立索引。
本文主要讲解的内容有: 联合索引在B+树上的存储结构 联合索引的查找方式 为什么会有最左前缀匹配原则 在分享这篇文章之前,我在网上查了关于MySQL联合索引在B+树上的存储结构这个问题,翻阅了很多博客和技术文章...,其中有几篇讲述的与事实相悖。...首先,表T1有字段a,b,c,d,e,其中a是主键,除e为varchar其余为int类型,并创建了一个联合索引idx_t1_bcd(b,c,d),然后b、c、d三列作为联合索引,在B+树上的结构正如上图所示...最左前缀匹配原则 之所以会有最左前缀匹配原则和联合索引的索引构建方式及存储结构是有关系的。...到这里大家是否明白了为啥会有最左前缀匹配原则了吧。
(原文表述有误,如果通配符%不出现在开头,则可以用到索引,但根据具体情况不同可能只会用其中一个前缀) 情况六:范围查询 EXPLAIN SELECT * FROM employees.titles WHERE...(必须是最左前缀),但是范围列后面的列无法用到索引。...同时,索引最多用于一个范围列,因此如果查询条件中有两个范围列则无法全用到索引。...这里特别要说明MySQL一个有意思的地方,那就是仅用explain可能无法区分范围索引和多值匹配,因为在type中这两者都显示为range。...,但作用于emp_no上的“BETWEEN”实际上相当于“IN”,也就是说emp_no实际是多值精确匹配。
联合索引 MySQL中的索引可以以一定顺序引用多个列,这种索引叫做联合索引,一般的,一个联合索引是一个有序元组,其中各个元素均为数据表的一列 [9o76ezbvsk.png...上面的查询从分析结果看用到了PRIMARY索引,但是key_len为4,说明只用到了索引的第一列前缀。 情况三:查询条件用到了索引中列的精确匹配,但是中间某个条件未提供。...情况四:查询条件没有指定索引第一列。 [qig15ucj3w.png] 由于不是最左前缀,索引这样的查询显然用不到索引。...(原文表述有误,如果通配符%不出现在开头,则可以用到索引,但根据具体情况不同可能只会用其中一个前缀) 情况六:范围查询(由于B+树的顺序特点,尤其适合此类查询) [kwur6rqhld.png] 范围列可以用到索引...0.00001579),所以实在没有什么必要为其单独建索引 有一种与索引选择性有关的索引优化策略叫做前缀索引,就是用列的前缀代替整个列作为索引key,当前缀长度合适时,可以做到既使得前缀索引的选择性接近全列索引
情况二:最左前缀匹配。 情况三:查询条件用到了索引中列的精确匹配,但是中间某个条件未提供。 情况四:查询条件没有指定索引第一列。 情况五:匹配某列的前缀字符串。 情况六:范围查询。...在上文中,我们都是假设索引只引用了单个的列,实际上,MySQL中的索引可以以一定顺序引用多个列,这种索引叫做联合索引,一般的,一个联合索引是一个有序元组,其中各个元素均为数据表的一列...上面的查询从分析结果看用到了PRIMARY索引,但是key_len为4,说明只用到了索引的第一列前缀。 情况三:查询条件用到了索引中列的精确匹配,但是中间某个条件未提供。...情况五:匹配某列的前缀字符串。...(原文表述有误,如果通配符%不出现在开头,则可以用到索引,但根据具体情况不同可能只会用其中一个前缀) 情况六:范围查询。
领取专属 10元无门槛券
手把手带您无忧上云