精华内容
下载资源
问答
  • 最近小编在少数派发现了一篇文章,讲的是如何在Win10上与iPhone互联,最终实现在电脑上接打电话、收发短信,这个篇文章切实的解决了小编的使用痛点,IT之家小编亲自试验该方法可行,再此将方法分享出来,希望能让跟...

    最近小编在少数派发现了一篇文章,讲的是如何在Win10上与iPhone互联,最终实现在电脑上接打电话、收发短信,这个篇文章切实的解决了小编的使用痛点,IT之家小编亲自试验该方法可行,再此将方法分享出来,希望能让跟多的读者受益:

    互联协同作业是苹果生态中非常吸引人的功能之一,“Handoff”(接力)让iPhone上没做完的事情可以接着用Mac或iPad继续完成,举例来说当你的iPhone与Mac连接同一Wi-Fi时(iCloud帐号一致)你可以直接在Mac上接打来自iPhone上的电话;在Mac的iMessage上你也可以直接收发来自iPhone的信息;iPhone浏览的网页可以直接在Mac的Dock栏上打开继续浏览。正是这些功能让喜欢协同办公的用户欲罢不能,于是就有了买了iPhone买iPad,买了iPad买Mac的现象。

    那么这么棒的功能就只能在Mac上用吗?Windows电脑上可以做到吗?

    如果你在半年前问我,我肯定会告诉你是的,这么核心的功能人家没有任何理由会开放给第三方。但直到小编受刺客大大的启发后,翻阅不少网页后终于找到了一款神器,通过这款神器我们可以无缝的在Windows电脑上接打来自iPhone的电话,收发来自iPhone的短信,简直爽的不要不要,这下在PC网页输验证码时再也不用到处翻手机啦。

    好了不卖关子了,这款软件名叫“Dell Mobile Connect”对没错,从名字看就知道这是Dell出的软件,其实这款软件原本是Dell为自己旗舰笔记本XPS推出的一款应用,为的是让XPS用户在PC上实现与iPhone协同合作的功能,虽说是XPS专用,但经过大神研究其实如果安装好驱动和Windows 10端应用后,任何一款带蓝牙的Windows 10 PC都可以使用这款应用。

    Dell Mobile Connect简介:

    Dell Mobile Connect可以把计算机和智能手机进行完整的无线整合。通过鼠标、键盘和触摸屏享受手机的功能,实现拨打或接听电话、发送和接收短信、访问联系人、收取手机消息通知,毋庸置疑是一款定位生产力的软件。

    主要特点:

    • 免提电话–拨打和接听电话,通过计算机扬声器和麦克风进行通话;

    • 收发文本消息–使用计算机键盘发送和接收短信。有短信时,可通过"消息"选项卡或短信通知打开;

    • 通知–手机通知将显示在计算机上且您将能通过计算机的鼠标、键盘和触摸屏处理它们;

    • 联系人–通过计算机搜索手机电话簿,搜索相应的联系人并直接拨打电话或发送短信。

    好了废话不多,让我们进入教程阶段:

    1.准备工作:

    材料:iPhone一台、带有蓝牙功能的Win10电脑一台

    手机端下载:“Dell Mobile Connect”App

    电脑端下载:“Dell Mobile Connect”UWP客户端Dell驱动程序

    2.安装配置Windows端软件:

    • 安装Dell驱动程序▼

    打开下载好的驱动程序进行安装,只有安装后驱动程序后才能进行后续操作。

    • 安装“Dell Mobile Connect”UWP客户端

    虽然这款软件在微软商店有,但因为是专为XPS设计,所以其他机型无法安装,要安装AppxBundle格式,但安装AppxBundle格式前需要进行简单的设置:

    打开Windows控制面板,选择“更新和安全”选项,选择“针对开发人员”子选项卡,点选“旁加载应用”(需稍等片刻,部分机型可能需要重启)。▼

    然后安装下载好的“Dell Mobile Connect”UWP客户端(对就是那个名字很长的文件,ScreenovateTechnologies开头)▼

    3.在“Dell Mobile Connect”上将Windows与iPhone配对

    以上软件都安装完成后,我们要做的就是在软件上将iPhone与Windows配对,首先都要将蓝牙开启,因为“Dell Mobile Connect”的所有功能基本上都是基于蓝牙实现的。▼

    打开蓝牙后,点击PC软件最下面的“让我们开始吧”进入设置页面;▼

    在添加新手机中,选择“iPhone”(蓝牙不开启可是搜不到的哟),接下来选择你的手机,PC端与iPhone端都会出现配对码,iPhone端点击配对;▼

    配对成功后软件会弹出通知窗口,已连接iPhone▼

    因为软件的功能主要通过蓝牙实现,所以需要按照提示在蓝牙设置中,开启“同步联系人”和“显示通知”的权限,不开启的话软件是无法使用的。▼

    4.设置完成,享受Dell带来的便利吧

    现在我们就可以实现在PC上接打iPhone电话啦,从软件的上看,它主要有四大功能区:“通知”、“拨号”、“通讯录”和“信息”。在底部可以设置通知声音与勿扰模式。

    ▲Dell Mobile Connect的拨号与联系人界面

    当你专心工作时,它会最小化到系统托盘,如果有来电的话,会有相应的通知窗弹出,你可以选择直接用电脑接或手机接听。

    总结

    小编之前一直认为这些功能是无法实现的,直到我遇见了“Dell Mobile Connect”,它另辟蹊径的通过蓝牙连接实现了与iPhone的互联功能,虽然这些功能跟苹果的“Handoff”仍无法比较,但对于办公者来说,这几项功能确实已经够用了。他能让你在敲字或创作的时候专注于PC屏幕,不会分神;对于普通用户来说,当你浏览网页登陆账户需要手机验证码时,你就可以直接在电脑上复制粘贴,头都不用回,是不是很酷呢。另外,如果你有好用的效率工具也可以在评论区分享给我们。

    展开全文
  • 拼多多运营管理干货
  • SQL优化最干货总结 - MySQL(2020最新版)

    万次阅读 多人点赞 2020-06-29 16:55:47
    MySQL - SQL优化干货总结(吐血版),别辜负了自己的梦想,欢迎白嫖、点赞、收藏。

    小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL专栏目录 | 点击这里

    前言

    BATJTMD等大厂的面试难度越来越高,但无论从大厂还是到小公司,一直未变的一个重点就是对SQL优化经验的考察。一提到数据库,先“说一说你对SQL优化的见解吧?”。SQL优化已经成为衡量程序猿优秀与否的硬性指标,甚至在各大厂招聘岗位职能上都有明码标注,如果是你,在这个问题上能吊打面试官还是会被吊打呢?

    (注:如果看着模糊,可能是你撸多了)

    目录

    前言

    SELECT语句 - 语法顺序:

    SELECT语句 - 执行顺序:

    SQL优化策略

    一、避免不走索引的场景

    二、SELECT语句其他优化

    三、增删改 DML 语句优化

    四、查询条件优化

    五、建表优化

    一张照片背后的故事(自娱角)


    有朋友疑问到,SQL优化真的有这么重要么?如下图所示,SQL优化在提升系统性能中是:(成本最低 && 优化效果最明显) 的途径。如果你的团队在SQL优化这方面搞得很优秀,对你们整个大型系统可用性方面无疑是一个质的跨越,真的能让你们老板省下不止几沓子钱。

    • 优化成本:硬件>系统配置>数据库表结构>SQL及索引。
    • 优化效果:硬件<系统配置<数据库表结构<SQL及索引。
    String result = "嗯,不错,";
    
    if ("SQL优化经验足") {
        if ("熟悉事务锁") {
            if ("并发场景处理666") {
                if ("会打王者荣耀") {
                    result += "明天入职" 
                }
            }
        }
    } else {
        result += "先回去等消息吧";
    } 
    
    Logger.info("面试官:" + result );

    别看了,上面这是一道送命题。

    好了我们言归正传,首先,对于MySQL层优化我一般遵从五个原则:

    1. 减少数据访问: 设置合理的字段类型,启用压缩,通过索引访问等减少磁盘IO
    2. 返回更少的数据: 只返回需要的字段和数据分页处理 减少磁盘io及网络io
    3. 减少交互次数: 批量DML操作,函数存储等减少数据连接次数
    4. 减少服务器CPU开销: 尽量减少数据库排序操作以及全表查询,减少cpu 内存占用
    5. 利用更多资源: 使用表分区,可以增加并行操作,更大限度利用cpu资源

    总结到SQL优化中,就三点:

    • 最大化利用索引;
    • 尽可能避免全表扫描;
    • 减少无效数据的查询;

    理解SQL优化原理 ,首先要搞清楚SQL执行顺序:

    SELECT语句 - 语法顺序:

    1. SELECT 
    2. DISTINCT <select_list>
    3. FROM <left_table>
    4. <join_type> JOIN <right_table>
    5. ON <join_condition>
    6. WHERE <where_condition>
    7. GROUP BY <group_by_list>
    8. HAVING <having_condition>
    9. ORDER BY <order_by_condition>
    10.LIMIT <limit_number>


     

    SELECT语句 - 执行顺序:

    FROM
    <表名> # 选取表,将多个表数据通过笛卡尔积变成一个表。
    ON
    <筛选条件> # 对笛卡尔积的虚表进行筛选
    JOIN <join, left join, right join...> 
    <join表> # 指定join,用于添加数据到on之后的虚表中,例如left join会将左表的剩余数据添加到虚表中
    WHERE
    <where条件> # 对上述虚表进行筛选
    GROUP BY
    <分组条件> # 分组
    <SUM()等聚合函数> # 用于having子句进行判断,在书写上这类聚合函数是写在having判断里面的
    HAVING
    <分组筛选> # 对分组后的结果进行聚合筛选
    SELECT
    <返回数据列表> # 返回的单列必须在group by子句中,聚合函数除外
    DISTINCT
    # 数据除重
    ORDER BY
    <排序条件> # 排序
    LIMIT
    <行数限制>


    SQL优化策略

    声明:以下SQL优化策略适用于数据量较大的场景下,如果数据量较小,没必要以此为准,以免画蛇添足。


    一、避免不走索引的场景

    1. 尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描。如下:

    SELECT * FROM t WHERE username LIKE '%陈%'

    优化方式:尽量在字段后面使用模糊查询。如下:

    SELECT * FROM t WHERE username LIKE '陈%'

    如果需求是要在前面使用模糊查询,

    • 使用MySQL内置函数INSTR(str,substr) 来匹配,作用类似于java中的indexOf(),查询字符串出现的角标位置,可参阅《MySQL模糊查询用法大全(正则、通配符、内置函数等)》
    • 使用FullText全文索引,用match against 检索
    • 数据量较大的情况,建议引用ElasticSearch、solr,亿级数据量检索速度秒级
    • 当表数据量较少(几千条儿那种),别整花里胡哨的,直接用like '%xx%'。

     

    2. 尽量避免使用in 和not in,会导致引擎走全表扫描。如下:

    SELECT * FROM t WHERE id IN (2,3)

    优化方式:如果是连续数值,可以用between代替。如下:

    SELECT * FROM t WHERE id BETWEEN 2 AND 3

    如果是子查询,可以用exists代替。详情见《MySql中如何用exists代替in》如下:

    -- 不走索引
    select * from A where A.id in (select id from B);
    -- 走索引
    select * from A where exists (select * from B where B.id = A.id);


     
    3. 尽量避免使用 or,会导致数据库引擎放弃索引进行全表扫描。如下:

    SELECT * FROM t WHERE id = 1 OR id = 3

    优化方式:可以用union代替or。如下:

    SELECT * FROM t WHERE id = 1
       UNION
    SELECT * FROM t WHERE id = 3

    4. 尽量避免进行null值的判断,会导致数据库引擎放弃索引进行全表扫描。如下:

    SELECT * FROM t WHERE score IS NULL

    优化方式:可以给字段添加默认值0,对0值进行判断。如下:

    SELECT * FROM t WHERE score = 0

     

    5.尽量避免在where条件中等号的左侧进行表达式、函数操作,会导致数据库引擎放弃索引进行全表扫描。

    可以将表达式、函数操作移动到等号右侧。如下:

    -- 全表扫描
    SELECT * FROM T WHERE score/10 = 9
    -- 走索引
    SELECT * FROM T WHERE score = 10*9

     

    6. 当数据量大时,避免使用where 1=1的条件。通常为了方便拼装查询条件,我们会默认使用该条件,数据库引擎会放弃索引进行全表扫描。如下:

    SELECT username, age, sex FROM T WHERE 1=1

    优化方式:用代码拼装sql时进行判断,没 where 条件就去掉 where,有where条件就加 and。


    7. 查询条件不能用 <> 或者 !=

    使用索引列作为条件进行查询时,需要避免使用<>或者!=等判断条件。如确实业务需要,使用到不等于符号,需要在重新评估索引建立,避免在此字段上建立索引,改由查询条件中其他索引字段代替。


    8. where条件仅包含复合索引非前置列

    如下:复合(联合)索引包含key_part1,key_part2,key_part3三列,但SQL语句没有包含索引前置列"key_part1",按照MySQL联合索引的最左匹配原则,不会走联合索引。详情参考《联合索引的使用原理》

    select col1 from table where key_part2=1 and key_part3=2


    9. 隐式类型转换造成不使用索引 

    如下SQL语句由于索引对列类型为varchar,但给定的值为数值,涉及隐式类型转换,造成不能正确走索引。 

    select col1 from table where col_varchar=123; 


    10. order by 条件要与where中条件一致,否则order by不会利用索引进行排序

    -- 不走age索引
    SELECT * FROM t order by age;
    
    -- 走age索引
    SELECT * FROM t where age > 0 order by age;

    对于上面的语句,数据库的处理顺序是:

    • 第一步:根据where条件和统计信息生成执行计划,得到数据。
    • 第二步:将得到的数据排序。当执行处理数据(order by)时,数据库会先查看第一步的执行计划,看order by 的字段是否在执行计划中利用了索引。如果是,则可以利用索引顺序而直接取得已经排好序的数据。如果不是,则重新进行排序操作。
    • 第三步:返回排序后的数据。

    当order by 中的字段出现在where条件中时,才会利用索引而不再二次排序,更准确的说,order by 中的字段在执行计划中利用了索引时,不用排序操作。

    这个结论不仅对order by有效,对其他需要排序的操作也有效。比如group by 、union 、distinct等。

    11. 正确使用hint优化语句

    MySQL中可以使用hint指定优化器在执行时选择或忽略特定的索引。一般而言,处于版本变更带来的表结构索引变化,更建议避免使用hint,而是通过Analyze table多收集统计信息。但在特定场合下,指定hint可以排除其他索引干扰而指定更优的执行计划。

    1. USE INDEX 在你查询语句中表名的后面,添加 USE INDEX 来提供希望 MySQL 去参考的索引列表,就可以让 MySQL 不再考虑其他可用的索引。例子: SELECT col1 FROM table USE INDEX (mod_time, name)...
    2. IGNORE INDEX 如果只是单纯的想让 MySQL 忽略一个或者多个索引,可以使用 IGNORE INDEX 作为 Hint。例子: SELECT col1 FROM table IGNORE INDEX (priority) ...
    3. FORCE INDEX 为强制 MySQL 使用一个特定的索引,可在查询中使用FORCE INDEX 作为Hint。例子: SELECT col1 FROM table FORCE INDEX (mod_time) ...

    在查询的时候,数据库系统会自动分析查询语句,并选择一个最合适的索引。但是很多时候,数据库系统的查询优化器并不一定总是能使用最优索引。如果我们知道如何选择索引,可以使用FORCE INDEX强制查询使用指定的索引。《MySQL中特别实用的几种SQL语句送给大家》博文建议阅读,干货

    例如:

    SELECT * FROM students FORCE INDEX (idx_class_id) WHERE class_id = 1 ORDER BY id DESC;

     

    二、SELECT语句其他优化

    1. 避免出现select *

    首先,select * 操作在任何类型数据库中都不是一个好的SQL编写习惯。

    使用select * 取出全部列,会让优化器无法完成索引覆盖扫描这类优化,会影响优化器对执行计划的选择,也会增加网络带宽消耗,更会带来额外的I/O,内存和CPU消耗。

    建议提出业务实际需要的列数,将指定列名以取代select *。具体详情见《为什么大家都说SELECT * 效率低》


    2. 避免出现不确定结果的函数

    特定针对主从复制这类业务场景。由于原理上从库复制的是主库执行的语句,使用如now()、rand()、sysdate()、current_user()等不确定结果的函数很容易导致主库与从库相应的数据不一致。另外不确定值的函数,产生的SQL语句无法利用query cache。


    3.多表关联查询时,小表在前,大表在后。

    在MySQL中,执行 from 后的表关联查询是从左往右执行的(Oracle相反),第一张表会涉及到全表扫描,所以将小表放在前面,先扫小表,扫描快效率较高,在扫描后面的大表,或许只扫描大表的前100行就符合返回条件并return了。

    例如:表1有50条数据,表2有30亿条数据;如果全表扫描表2,你品,那就先去吃个饭再说吧是吧。

    4. 使用表的别名

    当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个列名上。这样就可以减少解析的时间并减少哪些友列名歧义引起的语法错误。


    5. 用where字句替换HAVING字句

    避免使用HAVING字句,因为HAVING只会在检索出所有记录之后才对结果集进行过滤,而where则是在聚合前刷选记录,如果能通过where字句限制记录的数目,那就能减少这方面的开销。HAVING中的条件一般用于聚合函数的过滤,除此之外,应该将条件写在where字句中。

    where和having的区别:where后面不能使用组函数

    6.调整Where字句中的连接顺序

    MySQL采用从左往右,自上而下的顺序解析where子句。根据这个原理,应将过滤数据多的条件往前放,最快速度缩小结果集。


    三、增删改 DML 语句优化

    1. 大批量插入数据

    如果同时执行大量的插入,建议使用多个值的INSERT语句(方法二)。这比使用分开INSERT语句快(方法一),一般情况下批量插入效率有几倍的差别。

    方法一:

    insert into T values(1,2); 
    
    insert into T values(1,3); 
    
    insert into T values(1,4);

    方法二:

    Insert into T values(1,2),(1,3),(1,4); 


    选择后一种方法的原因有三。 

    • 减少SQL语句解析的操作,MySQL没有类似Oracle的share pool,采用方法二,只需要解析一次就能进行数据的插入操作;
    • 在特定场景可以减少对DB连接次数
    • SQL语句较短,可以减少网络传输的IO。

    2. 适当使用commit

    适当使用commit可以释放事务占用的资源而减少消耗,commit后能释放的资源如下:

    • 事务占用的undo数据块;
    • 事务在redo log中记录的数据块; 
    • 释放事务施加的,减少锁争用影响性能。特别是在需要使用delete删除大量数据的时候,必须分解删除量并定期commit。


    3. 避免重复查询更新的数据

    针对业务中经常出现的更新行同时又希望获得改行信息的需求,MySQL并不支持PostgreSQL那样的UPDATE RETURNING语法,在MySQL中可以通过变量实现。

    例如,更新一行记录的时间戳,同时希望查询当前记录中存放的时间戳是什么,简单方法实现:

    Update t1 set time=now() where col1=1; 
    
    Select time from t1 where id =1; 

    使用变量,可以重写为以下方式: 

    Update t1 set time=now () where col1=1 and @now: = now (); 
    
    Select @now; 

    前后二者都需要两次网络来回,但使用变量避免了再次访问数据表,特别是当t1表数据量较大时,后者比前者快很多。


    4.查询优先还是更新(insert、update、delete)优先

    MySQL 还允许改变语句调度的优先级,它可以使来自多个客户端的查询更好地协作,这样单个客户端就不会由于锁定而等待很长时间。改变优先级还可以确保特定类型的查询被处理得更快。我们首先应该确定应用的类型,判断应用是以查询为主还是以更新为主的,是确保查询效率还是确保更新的效率,决定是查询优先还是更新优先。下面我们提到的改变调度策略的方法主要是针对只存在表锁的存储引擎,比如 MyISAM 、MEMROY、MERGE,对于Innodb 存储引擎,语句的执行是由获得行锁的顺序决定的。MySQL 的默认的调度策略可用总结如下:

    1)写入操作优先于读取操作。

    2)对某张数据表的写入操作某一时刻只能发生一次,写入请求按照它们到达的次序来处理。

    3)对某张数据表的多个读取操作可以同时地进行。MySQL 提供了几个语句调节符,允许你修改它的调度策略:

    • LOW_PRIORITY关键字应用于DELETE、INSERT、LOAD DATA、REPLACE和UPDATE;
    • HIGH_PRIORITY关键字应用于SELECT和INSERT语句;
    • DELAYED关键字应用于INSERT和REPLACE语句。


           如果写入操作是一个 LOW_PRIORITY(低优先级)请求,那么系统就不会认为它的优先级高于读取操作。在这种情况下,如果写入者在等待的时候,第二个读取者到达了,那么就允许第二个读取者插到写入者之前。只有在没有其它的读取者的时候,才允许写入者开始操作。这种调度修改可能存在 LOW_PRIORITY写入操作永远被阻塞的情况。

    SELECT 查询的HIGH_PRIORITY(高优先级)关键字也类似。它允许SELECT 插入正在等待的写入操作之前,即使在正常情况下写入操作的优先级更高。另外一种影响是,高优先级的 SELECT 在正常的 SELECT 语句之前执行,因为这些语句会被写入操作阻塞。如果希望所有支持LOW_PRIORITY 选项的语句都默认地按照低优先级来处理,那么 请使用--low-priority-updates 选项来启动服务器。通过使用 INSERTHIGH_PRIORITY 来把 INSERT 语句提高到正常的写入优先级,可以消除该选项对单个INSERT语句的影响。


    四、查询条件优化

    1. 对于复杂的查询,可以使用中间临时表 暂存数据;


    2. 优化group by语句

    默认情况下,MySQL 会对GROUP BY分组的所有值进行排序,如 “GROUP BY col1,col2,....;” 查询的方法如同在查询中指定 “ORDER BY col1,col2,...;” 如果显式包括一个包含相同的列的 ORDER BY子句,MySQL 可以毫不减速地对它进行优化,尽管仍然进行排序。

    因此,如果查询包括 GROUP BY 但你并不想对分组的值进行排序,你可以指定 ORDER BY NULL禁止排序。例如:

    SELECT col1, col2, COUNT(*) FROM table GROUP BY col1, col2 ORDER BY NULL ;

    3. 优化join语句

    MySQL中可以通过子查询来使用 SELECT 语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的 SQL 操作,同时也可以避免事务或者表锁死,并且写起来也很容易。但是,有些情况下,子查询可以被更有效率的连接(JOIN)..替代。


    例子:假设要将所有没有订单记录的用户取出来,可以用下面这个查询完成:

    SELECT col1 FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )


    如果使用连接(JOIN).. 来完成这个查询工作,速度将会有所提升。尤其是当 salesinfo表中对 CustomerID 建有索引的话,性能将会更好,查询如下:

    SELECT col1 FROM customerinfo 
       LEFT JOIN salesinfoON customerinfo.CustomerID=salesinfo.CustomerID 
          WHERE salesinfo.CustomerID IS NULL 

    连接(JOIN).. 之所以更有效率一些,是因为 MySQL 不需要在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作。


    4. 优化union查询

    MySQL通过创建并填充临时表的方式来执行union查询。除非确实要消除重复的行,否则建议使用union all。原因在于如果没有all这个关键词,MySQL会给临时表加上distinct选项,这会导致对整个临时表的数据做唯一性校验,这样做的消耗相当高。

    高效:

    SELECT COL1, COL2, COL3 FROM TABLE WHERE COL1 = 10 
    
    UNION ALL 
    
    SELECT COL1, COL2, COL3 FROM TABLE WHERE COL3= 'TEST'; 

    低效:

    SELECT COL1, COL2, COL3 FROM TABLE WHERE COL1 = 10 
    
    UNION 
    
    SELECT COL1, COL2, COL3 FROM TABLE WHERE COL3= 'TEST';

    5.拆分复杂SQL为多个小SQL,避免大事务

    • 简单的SQL容易使用到MySQL的QUERY CACHE; 
    • 减少锁表时间特别是使用MyISAM存储引擎的表; 
    • 可以使用多核CPU。

    6. 使用truncate代替delete

    当删除全表中记录时,使用delete语句的操作会被记录到undo块中,删除记录也记录binlog,当确认需要删除全表时,会产生很大量的binlog并占用大量的undo数据块,此时既没有很好的效率也占用了大量的资源。

    使用truncate替代,不会记录可恢复的信息,数据不能被恢复。也因此使用truncate操作有其极少的资源占用与极快的时间。另外,使用truncate可以回收表的水位,使自增字段值归零。

    7. 使用合理的分页方式以提高分页效率

    使用合理的分页方式以提高分页效率 针对展现等分页需求,合适的分页方式能够提高分页的效率。

    案例1: 

    select * from t where thread_id = 10000 and deleted = 0 
       order by gmt_create asc limit 0, 15;


           上述例子通过一次性根据过滤条件取出所有字段进行排序返回。数据访问开销=索引IO+索引全部记录结果对应的表数据IO。因此,该种写法越翻到后面执行效率越差,时间越长,尤其表数据量很大的时候。

    适用场景:当中间结果集很小(10000行以下)或者查询条件复杂(指涉及多个不同查询字段或者多表连接)时适用。


    案例2: 

    select t.* from (select id from t where thread_id = 10000 and deleted = 0
       order by gmt_create asc limit 0, 15) a, t 
          where a.id = t.id; 

    上述例子必须满足t表主键是id列,且有覆盖索引secondary key:(thread_id, deleted, gmt_create)。通过先根据过滤条件利用覆盖索引取出主键id进行排序,再进行join操作取出其他字段。数据访问开销=索引IO+索引分页后结果(例子中是15行)对应的表数据IO。因此,该写法每次翻页消耗的资源和时间都基本相同,就像翻第一页一样。

    适用场景:当查询和排序字段(即where子句和order by子句涉及的字段)有对应覆盖索引时,且中间结果集很大的情况时适用。

    五、建表优化

    1. 在表中建立索引,优先考虑where、order by使用到的字段。


    2. 尽量使用数字型字段(如性别,男:1 女:2),若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。
    这是因为引擎在处理查询和连接时会 逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。


    3. 查询数据量大的表 会造成查询缓慢。主要的原因是扫描行数过多。这个时候可以通过程序,分段分页进行查询,循环遍历,将结果合并处理进行展示。要查询100000到100050的数据,如下:

    SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY ID ASC) AS rowid,* 
       FROM infoTab)t WHERE t.rowid > 100000 AND t.rowid <= 100050

    4. 用varchar/nvarchar 代替 char/nchar

    尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
    不要以为 NULL 不需要空间,比如:char(100) 型,在字段建立时,空间就固定了, 不管是否插入值(NULL也包含在内),都是占用 100个字符的空间的,如果是varchar这样的变长字段, null 不占用空间。

     

    一张照片背后的故事(自娱角)

     

    这是由蒋玉树先生所拍摄的照片《小店》
    在四川凉山
    母亲临时有事
    让自己的女儿帮忙看店

    突然天上下起了雪
    在这个只有一面墙的小店里
    女孩儿一边搓着手
    一边欣赏着美景

     

    这些MySQL文章你可能也会喜欢:

    《MySQL中的 utf8 并不是真正的UTF-8编码 ! !》

    《MySQL中特别实用的几种SQL语句送给大家》

    《SQL 查询语句先执行 SELECT?兄弟你认真的么?》

    《有意思,原来SQL中的NULL是这么回事儿》

     

    展开全文
  • 干货 | 携程酒店RSocket实践

    千次阅读 2019-08-14 20:20:00
    作者简介刘诚,携程酒店研发性能架构师。2014年加入携程,致力于通过架构的演进,控制企业硬件成本。一、初识RSocket在QCon2019北京大会上第一次得知RSocke...

    作者简介

    刘诚,携程酒店研发性能架构师。2014年加入携程,致力于通过架构的演进,控制企业硬件成本。

    一、初识RSocket

    在QCon2019北京大会上第一次得知RSocket。印象深刻的是Netifi公司通过他们研发的RSocket帮助企业实现微服务,在40,000RPS的场景下,Istio需要每月3495美金,而Netifi每月只要388美金,同时性能提升10倍,这无疑对任何企业都是极具吸引力的。

    Netiffi的创始人在会上也谈到,使用Netiffi的Broker,得益于RSocket协议,无需独立部署监控、服务发现、健康检查、负载均衡等等中间件。如果是跨云部署,例如谷歌云与亚马逊云之间,或者亚马逊云与企业本地数据中心,都只要通过Netiffi的Broker即可无缝沟通,无需处理复杂的适配问题。

    回来查询了不算丰富的资料后发现,Istio的技术专家发文称RSocket Broker的service mesh比Istio有将近10倍的速度提升。考虑到Istio专家的观点还有一定说服力的,那么RSocket真的有那么厉害?

    二、RSocket生产实践

    我们决定到生产上面去实践RSocket,看看性能到底如何。现在已经支持RSocket的service框架有Spring Flux:

    640?wx_fmt=png

     

    Dubbo3.0 snapshot

    640?wx_fmt=png

    压测对比的是Dubbo2.7。Dubbo2.7的样例代码如下:

    640?wx_fmt=png

    Dubbo3的样例代码如下:

    640?wx_fmt=png

    SpringFlux的样例代码如下:

    640?wx_fmt=png

    分别压测QPS200,400和800的情况,结果显示CPU、内存和响应时间基本一致。是不是压测方式有问题,为什么性能一点也没有提高?


    三、RSocket的定义

    在解答上面的问题之前,我们先来看看RSocket到底是什么?

    官方定义:RSocket是基于reactive stream flow control的双向的、多路的、基于消息的、二进制通讯协议。它提供了4种交互模式:

    • request - response:一个请求,一个响应。现在的Restful服务既是如此;

    • fire-and-forget:对于那些不关心结果的请求,直接返回;

    • request – stream:一个请求,多次结果返回;

    • channel:服务器可以发多个请求给客户端,客户端也可以发多个结果给服务器;

    几个特点:

    • 可取消:请求和响应都可取消,能够高效的清理系统资源;

    • 可中断后继续:如果被调用方卡住了,请求方可断开后,过一会再过来重试;

    • 可租赁:响应者可根据自己的实际情况来控制调用方的频率,其实就是响应式编程中的背压的实现;

    上面只是定义了RSocket协议,在具体的实现上面是非常灵活的。

    进一步查询资料后发现,现有JAVA的RSocket实现一般都是基于TCP长连接。熟悉Dubbo的朋友,立刻就会想到Dubbo不就是基于TCP长连接进行服务调用的么。是的,但是不同之处在于RSocket是一系列的协议规范,原先的Dubbo虽然也是基于TCP长连接实现的,但是并没有完全按照RSocket的规范来进行实现。

    更加确切的来说,那个时候应该还没有RSocket。这个也就帮助我们理解为什么Dubbo3开始接入RSocket,以及阿里为什么也是RSocket的拥护者之一。至此就能理解为什么性能没提高了,在我们实践的场景中,只是把原来基于HTTP的请求方式变成了基于TCP的实现。就生产结果而言,并没有性能大幅提升,更别提10倍的提升。

    那RSocket只有TCP长连接的优势?


    四、RSocket协议的业务开发优势

    作为一名一线业务开发者,可能更关心的是使用RSocket协议写业务代码时的优劣势。就我个人而言,感觉还是很棒的。例如下面这个传入参数为Mono,返回也为Mono类型的接口定义方式。

    640?wx_fmt=png

    熟悉响应式编程的同学应该知道Mono是Pivotal Reactor Core中的一种类型。是一种特殊的发布者,最多只发布一次。

    640?wx_fmt=png

    如果应用本身就是以非堵塞的方式写的,那这里就可以直接使用reactor core的所有API。当然也有同学会说,即使不返回Mono,例如Dubbo2.7中的返回CompletableFuture,我们只要自己内部转换一下即可。然后应用里面照样可以使用reactor core或者rxjava等响应式编程的框架。

    的确如此,但是如果是Flux呢?可以多次、不断地往流里面写入结果的呢?CompletableFuture还能支持么?显然不行。因为flux本身就定义为最多可以发布n次。

    640?wx_fmt=png

    那为什么要用flux?

    flux是响应式编程中的一种常用对象,其实就是request -> stream一种实现。一个请求发起后,结果可以分批写回。好处是什么?例如:A服务调用B服务,B服务调用C和D服务,但是D服务很慢,如果是request -> response模式,那必须要等到C和D完成后,才能返回结果给A。如果是Request -> stream模式,则可以先把C的结果返回给A,然后等D的结果拿到了,在返回给A。这样就可以高效的利用系统资源,减少等待。

    熟悉Dubbo的同学可能会说,request -> stream这种模式也不是RSocket独有的吧,例如Dubbo就可以使用下面的方式来实现:

    640?wx_fmt=png

    看完上面的代码,然后我们可以思考一下如何用上面提供的API去实现下面的功能。你就会发现flux的这种Reactive Functional Programming的编程方式大大降低了编程的难度与代码量,提升了代码的可读性:

    640?wx_fmt=png

    但是这还不是全部的好处,下面我们来看看RSocket的另外一种使用场景。


    五、RSocket的展望

    响应式编程中有一个比较有名的功能叫背压。例如:当上游服务调用下游服务,而下游服务来不及处理的时候,可以选择性的限制上游服务的调用。

    640?wx_fmt=png

    而我们日常在刷手机的时候,经常会由于手机卡顿,无论是APP导致的还是网络导致的,重复点击或者刷新页面的情况。而HTTP本身是无状态的,所以只要有请求,无论是有效的还是无效的,服务器都会进行处理直到完成。

    但是如果有背压,那我们就可以一定程度上减少APP的无效和重复的请求。

    例如:用户查看订单列表,如果一下子过来10个请求,其实只要返回最后一个即可,前面9个都可以忽略。如果实现了,服务器就会减少流量,对硬件成本的控制有着非常积极的作用。InfoQ的文章中就提到:Facebook的工程师现在就是这样实现APP与服务器之间的通讯。

    之所以称之为展望,因为这个也是我们下一个实践的目标。

    参考资料

       


    大数据与人工智能沙龙

    8月24日上海

    火热报名中

    ↓↓↓

    640?wx_fmt=png

    【推荐阅读】

    640?wx_fmt=jpeg

    展开全文
  • 天猫新店运营思路分享(新店2个月飙至类目TOP10_一手纯干货)-知识杂货.doc
  • 干货 | 携程酒店DevOps测试实践

    千次阅读 2019-12-19 19:48:00
    作者简介王幸福,携程酒店研发部高级测试经理,负责无线自动化测试相关工作。在测试框架和平台研发、移动测试、DevOps等领域有着丰富的经验。如今很多大型互联网公司、创新型企业都在积极地进...

    作者简介

     

    王幸福,携程酒店研发部高级测试经理,负责无线自动化测试相关工作。在测试框架和平台研发、移动测试、DevOps等领域有着丰富的经验。

    如今很多大型互联网公司、创新型企业都在积极地进行DevOps实践和落地。为什么DevOps如此受青睐? 我们该如何实施DevOps?DevOps中Dev代表开发,Ops代表运维,那么在这个崭新的流程体系中,QA又该如何找到自己的位置?带着这些疑问和困惑,我们希望在本文中都能进行探索和解答。


    一、业务和技术变革驱动流程的变革

      

    以往在软件开发的世界里,以月甚至以年为周期进行发布是一种常态。但随着近些年由云、移动互联网、AI、社交技术以及区域链等技术推动的业务变革呈现爆炸式的发展。在这种大背景下,即使是大型的互联网公司也随时面临着业务上被淘汰的危险,持续的业务创新,快速的上线,卓越的用户体验以及快速的获得反馈才是企业制胜的法宝。

      

    业务在高速变革,那么技术怎么样呢?技术的变革比之业务,有过之而无不及。应用架构从以往的服务集中到如今盛行的微服务,IT架构从物理机、虚拟机到如今的容器化、云服务,开发技术栈无论是前端还是后端也都呈现百花齐放的姿态。

       

    无论是业务变革还是技术变革,最终都会对企业的开发流程造成影响,并进而推动其进行变革。从早期的瀑布式开发,到敏捷开发,再到如今的DevOps,其产生的背景无一不都有着业务和技术变革的影子。

    为什么当前我们需要DevOps,甚至很多大型的互联网公司也在进行DevOps转型,其中最关键是因为其核心思想能够满足当前业务和技术变革的需要,那就是“快速的交付价值,灵活的响应变化”。“快速的交付价值”意味着能先人一步占领市场,“灵活的响应变化”亦意味着减少变化带来的不利因素,使企业立于不败之地。

    业务和技术变革推动流程变革


    二、携程持续交付的现状和挑战

      

    携程在很久以前就已经开始进行持续交付的建设,应用部署全部实现了容器化, 并实现了一套自动化程度较高的持续集成发布系统-Ctrip CD(后面简称CD),CD发布流程如下图所示:

    携程发布流程图

      

    开发人员在功能开发完成并提交代码后, 可以自己操作或通知测试进行环境部署。进行环境部署的人员可以在CD中创建发布版本,然后由CD自动进行代码编译,代码扫描,安全扫描,测试环境部署等操作。测试人员完成测试后进行测试结果的反馈。如果测试通过继续通过CD进行UAT环境的部署,进行验证测试。测试通过后,发布生产环境。

    从上面流程图可以看出,整个发布过程自动化程度还是较高的,相关人员只要在CD中操作新建版本,关注发布状态就可以了。但我们仔细分析这个过程还是能发现不少问题:

    1)持续集成的反馈链路过长。我们往往希望在开发人员每次提交代码时就进行代码编译,代码扫描,单元测试等过程,而不是在功能开发完成后进行。

    2)人工介入依然过多。虽然在CD中可以完成大部分的编译,发布,部署等繁复且人工易出错的工作,但是否可以省略人工创建版本,测试环境手动测试,进而每次提交代码都触发一系列的操作,发布到UAT环境,甚至是生产环境(对于业务简单,单元测试和接口测试的应用)。

    3)CD发布系统解决了编译,部署,环境治理等大部分OPS相关的工作,但却没有考虑到如何把开发,测试以及发布后的监控等活动整合起来。

    上面提到的这些问题,也是携程希望引入Auto DevOps的原因之一。DevOps所提倡的“持续集成,持续测试,持续交付,持续部署”可以很好地解决这些问题,使整个研发效率提升。


    三、DevOps测试流程

      

    携程DevOps是基于GitLab CI/CD为主干实现的,并针对携程内部的情况进行了二次开发,实现auto devops的能力。本文关注的重点是在DevOps过程中的测试实践,所以在此就不赘述携程DevOps的实现细节,仅列出携程DevOps的主干流程。

     

    携程DevOps流程及测试流程图

      

    DevOps虽然从字面意义上看更着重于开发与运维的融合,但事实上却并非如此。DevOps可以看成是开发、运维和QA三者的交集,所以DevOps实施成功的关键在于各个阶段都不能有短板。DevOps通过自动化来实现“持续交付”的流程,那么自动化的手段中自然也包括测试的自动化。其倡导的“持续测试”也需要我们尽可能多的使用自动化手段来快速的发现和反馈问题,从而保障交付产品的质量。

    我认为“持续测试”并不仅仅是频度上的持续,还包括开发过程上的持续。我们希望在开发过程的各个阶段都可以有测试的介入,“测试左移”和“测试右移”的思想也由此而来。那么在携程DevOps流程中,我们根据自身的情况分三个阶段来进行测试的介入。

    第一阶段开发提交代码时,触发静态扫描(Sonar,Infer,代码风险扫描等),安全扫描,单元测试。如果这些测试不通过,将通知开发进行修复。

     

    第二阶段开发提交代码后,经过编译并部署到测试环境时,触发接口测试、熔断测试、比对测试、性能测试等。

     

    第三阶段测试环境测试通过后,发布到生产的镜像环境,在此环境进行流量回放测试,并进行发布前的验证确认工作,验证通过后可以进行生产发布。同时进行生产环境各项指标的监控工作。

    在整个过程中, 我们也会收集DevOps指标数据,日志,性能,测试数据,进行测试分析,通过算法进行风险评估,从而为提高测试决策质量,效率提升提供依据。

    俗话说“无规矩不成方圆”, 流程的制定只是搭了个架子。在这个架子下,我们还需要制定一系列流程标准来充实它,这也是相对比较困难的部分。因为制定的这些标准需要取得整个部门甚至整个公司的认可,并作为规范来严格的执行,这势必对现有的流程和规范造成很大的影响,推广难度还是比较大的。所以如有必要,甚至可以成立质量委员会来统一制定这些标准,并密切监控实施的过程,遇到问题和困难可以一起想办法解决。

    那么通常的标准有哪些呢?归纳下来,这些标准包括:

    • 提测标准:静态扫描结果,单元测试通过率,覆盖率,接口测试结果…

    • 测试规范:探索测试,用例执行,接口测试分析,性能测试…

    • 发布规范:风险分析,发布检查项…

    • 监控规范:业务,性能,日志数据收集,预警的条件….


    四、携程酒店DevOps测试平台– Moss


    有了流程和标准,我们就夯实了实施DevOps的基础。接下来需要一个平台来实践这些流程和标准,可以选择Gitlab CI/CD,也可以选择Jenkins,亦或者Gitlab与Jenkins结合。我们选择了自建平台,理由如下:

    1)无论是Gitlab还是Jenkins都需要进行较复杂的配置文件设置,对于开发和测试人员都有一定的学习成本,所以我们希望通过可视化配置的方式来简化配置过程,这样既能提高配置的效率,也能减少推广的难度。

    2)携程酒店测试使用的工具和平台很多都是内部研发的,市面上的DevOps平台整合这些工具和平台并没有现成的方案可用。

    3)我们希望DevOps测试过程并不仅仅是给测试看的,我们希望开发,测试,产品都可以从这个平台中看到自己需要的东西。

    4)DevOps最理想的状态是可以直接自动发布到生产。可目前现实的情况却很少有应用可以做到,那么我们希望提供尽可能多的评估和反馈数据来缩短发布确认的过程。

    Moss平台


    4.1 DevOps测试工具链  

    在实施DevOps过程中会涉及到很多的工具,我们把这些工具形象的称为工具链,而合理的整合工具链中的工具也是DevOps是否成功的关键因素之一。在测试各个阶段常用的测试手段通常包括静态代码扫描,单元测试,接口测试,UI自动化测试,流量回放等等。而这些测试手段在业界都有比较成熟的开源框架,比如SonarQube、Junit、Selenim、Appnium…. . 携程酒店测试根据自身情况,结合这些开源框架开发了一系列的平台和工具。

    携程酒店DevOps测试工具链

    静态扫描作为一种近乎零成本的测试手段,可以在早期发现代码中存在的代码缺陷,安全漏洞等问题。在静态扫描领域,SonarQube已经深耕多年,在这方面已经近乎成为标配。携程通过对原有SonarQube代码规范库中的规范进行筛选和扩展,形成了自己代码规范库。我们还有基于开源框架开发的安全扫描工具Cobra和Buffalo。在我们的DevOps流程中,开发人员在提交代码后就会触发Sonar,Infer,Cobra,Buffalo等一系列的静态扫描手段进行代码检测。

      

    单元测试随着敏捷开发的盛行而引起了大家的重视,虽然目前在国内对单元测试的重视程度依然欠缺,但从众多大型的开源项目可以看出单元测试确实在软件的开发质量保障方面有着积极的作用。我们为了整合单元测试的编写,执行和结果而开发了UTP单元测试平台。该平台由Junit扩展库UtpJunit,IDEA插件UtpGenerator以及Utp站点组成。该平台实现了BDD驱动,代码分析,在线WebIDE,单元测试执行,覆盖率统计,报告展示,持续集成等功能。

      

    集成测试阶段主要进行接口测试,数据库测试,Job测试等等。无论是RPC,SOA还是目前流行的微服务,都是在强调对外提供服务的能力。而这种能力主要通过提供对外接口来实现,这也决定了接口测试的重要性。我们为此构建了CAS平台,CAS平台是一个同时支持有码和无码接口自动化测试的平台。

    CAS自动化测试平台

    测试过程中一个比较难以解决的困难是测试数据问题。为了保障接口测试和UI自动化测试数据的可用性,我们开发了MOCK系统,用于测试人员配置和管理测试数据。

      

    系统测试阶段是测试人员介入比较多的阶段,也是测试人员比较热衷做自动化测试的阶段。因此这个阶段的自动化测试框架也比较的多。常用的Web自动化框架有Selenim,Jest,Jasmine…,常用的APP自动化测试框架有Appnium,Airtest,Clabash,UIAutomator…. 而这些自动化测试框架是百花齐放,各有所长,要根据自身团队的实际情况慎重选择适合自己的框架。

    在Web自动化测试方面,我们选择了Selenium框架作为基础进行二次开发,而在APP自动化测试方面,我们构建了自己内部的测试云平台- ATL(APP Test Lab),该平台支持设备管理,也同时支持Appnium和Airtest的用例管理,执行和报告查看。

    ATL自动化测试平台

      

    线上监控作为”测试右移”的重要手段之一,正越来越引起很多公司的重视。通常在服务器,网络,框架,性能等方面,OPS会有众多的监控和预警机制。但在业务,功能等一些特定指标上却无法兼顾到,那么我们就需要自己去监控和预警,这些监控大致可以分为数据库数据监控,埋点监控,接口监控,UI监控等。

    携程酒店测试监控平台

      

    除了以上的工具和平台,我们还有一些经常使用的工具和平台,限于篇幅,不在这里一一介绍。而这么多的工具和平台,以往都是测试人员在各个平台切换使用,容易混乱,效率也低,工具之间无法产生化学反应。我们需要通过DevOps把这些工具整合起来,形成工具链,这也就是我们经常提到的pipeline.

    Moss平台的pipeline整合了众多的工具和平台

     

    4.2 DevOps数据中心   

    DevOps的精益思想需要数据支持来减少不必要的浪费,DevOps是否成功得到实施需要数据来反馈各项指标数据,公司的领导需要知道当前团队代码问题,覆盖率情况,Bug等数据… 等等这些都需要数据。

    这些数据来源在哪里? 自然来自DevOps所整合的各个平台和工具。所以我们需要一个DevOps数据中心来收集和分析这些数据,并把数据以可视化的方式展示给相关的人员,让相关人员可以看到自己需要的数据。

     

      DevOps数据中心架构示意图

      

    Moss平台的DevOps数据中心通过收集器从各个工具链平台中拉取数据存放到MongoDB中。Neo4j是一款NOSQL图形数据库,用于存放人与人,人与应用,应用与应用之前的关系和数据,为以后聚合团队数据,数据关联提供支持。

      

    同时DevOps数据中心还提供了可视化数据编辑功能,可以让用户以可视化配置的方式来配置数据的可视化看板。而且秉承着一切数据都是可以被搜索的理念, 我们提供一个搜索引擎让用户搜索到自己想要的数据,并以可视化的形式展示出来。

      

    应用看板,技术价值流看板


    五、总结和未来展望


    测试在历经了瀑布式开发,敏捷开发阶段后,其测试体系的基础并没有受到太多的冲击和改变,但在“来势汹汹”的DevOps浪潮中, 我认为测试的根基已经受到了一定的动摇,过去那种固有的测试思维已经难以适应当下测试的需要。作为测试人,如果不想被时代淘汰,就需要主动去适应这种转变,去积极挖掘测试在DevOps体系中的价值。

    在实施DevOps的过程中,我们也遇到了很多的困难和挑战,同时也收获了很多的经验和教训。总结下来主要有这么几点:

    • 高度自动化,尽可能减少人为干预

    • 需要快速且准确的反馈问题

    • 要制定DevOps流程中可行的规范

    • 关注DevOps指标,优化流程和提高效率

    目前, 我们实施的DevOps还处于初期阶段,很多方面尚未完全达到预期。在不久的将来我们还有很多的工作需要去做:

    • 进一步完善流程标准和挖掘数据来提高效率和软件质量

    • 采用机器学习来实现基于风险和变更的测试策略

    • 进一步加强质量可视化实现

    • 基于Moss的数据整合能力,实现监控一体化

    • 开发Chrome插件Moss Detector,进一步加强用户在DevOps中的交互和效率提升

    注:携程技术微信公众号后台回复“devops”,可下载讲师分享PPT。

    【推荐阅读】

     “携程技术”公众号

      分享,交流,成长

    展开全文
  • 必读实操干货-运营带你玩转店铺推广.pdf
  • 身上的干货也不再是一个面试的资本了,所以今天把想到的一一说来分享给各位。 首先从免费流量开始吧: A自然搜索:大方面不多少大家都懂,小方面要注意的: 1:店铺商品滞销率(一个月没有成交商品占店铺总商品的...
  • 干货 | 携程酒店安卓地图开发实践

    千次阅读 2020-03-19 17:00:00
    作者简介 亦枫,携程资深软件工程师,负责酒店业务 Android 客户端的相关研发工作。当前大多数移动互联网 App 都会存在地图相关功能,尤其是 LB...
  • 天猫新店运营思路分享(新店2个月飙至类目TOP10_一手纯干货).doc
  • 作者简介刘晓攀,携程酒店性能测试负责人,专注性能测试分析和辅助测试工具的开发。一、前言Mock在整个软件开发测试周期中已经非常普遍,我们也会经常有意无意地使用它。譬如开发...
  • 每日干货——每日分享技术干货App

    千次阅读 2018-08-15 17:26:34
    每日干货——每日分享技术干货(周末不更新 )。 API 来自Gank.io 是学习和练手简单之作。 Material Design设计,状态栏浸染。 使用了以下开源库: implementation 'de.hdodenhof:circleimageview:2.2.0' ...
  • 干货#015】小程序收货地址

    千次阅读 2017-11-16 10:36:33
    这是晓程序干货店第15篇干货分享 小程序在1.1.0版本开始原生支持获取微信本身的用户地址,并支持调起微信的地址编辑界面,不仅给开发者省却了重复造轮子的麻烦(特别是不用再造地址选择器轮子了),而且提升了...
  • 在上周六举行的MIT沙龙上,有5家移动互联网公司接受了雷锋网的邀请,并上台做了应用展示和经验分享,这5家公司我们在之前的预告中有做介绍,可以点击这里查看。第一家上场的是酒店管家,微博上比较活跃也很有影响力...
  • 面试干货

    2016-10-19 20:02:07
    今天收到日丰的offer,趁自己还有一点印象,记点东西下来。早上在下雨,我是9点多赶到嘉华酒店,确实豪华,厕所都一股香味,等了大概两个小时,我科目四都没去考,两人一组面,面试官也是两人,营销和非营销分开,...
  • 【管理干货】精细化管理可以有效提高店铺的业绩和运作效率.pdf
  • 干货来了!!! 近期有很多小伙伴都在问我,速卖通开店怎么开?具体流程是怎样的?有些怎样的费用?今天我就给大家讲讲速卖通开店的具体流程,以及所涉及到的一些费用,学会后3分钟就能开好一个店铺。 一、基本资料 ...
  • 抖音小店无货源项目问题汇总详解,全篇干货,建议收藏大家好,我是电商派大星。 抖音小店无货源作为一个全新的电商项目,受到很多人的关注, 但是大多数朋友们对于抖音小店无货源项目都还是一知半解, 只了解个大概...
  • 这是晓程序干货店第16篇干货分享 阅读该文前,请先完成微信小程序账号注册。 刚入门开发微信小程序的小伙伴,应该都会有怎么操作小程序数据库的困惑,数据放哪,怎么存取等?自己搭服务器,用腾讯云?...
  • 接下来,给大家分享一下亚马逊多店铺运营的具体思路,纯干货,要做好笔记啊! 首先,亚马逊规定一人一,那你只需要让官方觉得这些账号是由不同的人注册、运营和操作的不就行了。 其实导致亚马逊账号被关联的因素...
  • 今天欣欣给大家带来的干货是:关于新手小白接触抖音小店无货源该如何精细化运营~ 必须得安排一下,免得你们走弯路(敲黑板!) 可能有的朋友只是看到在网上会频繁地看到抖音小店无货源这个词,但是具体是怎么一回事...
  • 作者简介崔广宇,携程酒店研发部小程序开发经理,曾负责过反爬虫开发以及H5开发。本文将分享携程酒店小程序的一些开发经验, 和一些非技术的经验。这里的小程序包括微信小程序,支...
  • 一、什么是FEED ? Feed是lazada卖家中⼼流量(Traffic)模块免费触达消费者的⼯具,商家可以通过发布不同类型Feed 内 容触达需求多元化的消费者。 FEED 的好处: 增加曝光;...1. 登录ASC后台,在traffic 菜单列...
  • 赠品送地好,顾客还会回头,假如赠品赠的不当,那么无异于把活动和自己的推向了死亡的边缘,并不是所有东西都适合用来做赠品,而我们所要赠送的赠品呢? 送赠品有几个技巧需要注意: 1、品质过硬 赠品要...
  • 分布式系统的负载均衡 | 架构干货

    千次阅读 多人点赞 2019-07-17 15:39:47
    分布式系统的负载均衡 | 架构干货
  • 【速卖通运营干货】店铺没流量、没订单?这几点帮你了解流量来源,提升出单量! 随着国内经济逐渐复苏,很多商家也加入了跨境电商这一条奔腾的流量大河中,并逐渐有了一席之地,但也有很多新手卖家比较苦恼,因为...
  • 这是一款整理发布的XX大酒店贵重干货申购单,需要了解相关XX大酒店贵重干货申购单的你一定不容...该文档为XX大酒店贵重干货申购单,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 嵌入式资源—都是干货 ST官网 想必很多人都或多或少接触过或者听说过ARM,ST,那么这儿提供一下官方的一些网站,常见的STM32的资料这里就比较权威 ST官网(官方的,很权威) ST中文网(很多东西都没有) ST...
  • 作者简介小琴,携程高级数据经理,负责酒店BI、数仓工作,专注于大数据应用领域多年。一、背景随着时间推移和业务的快速发展,携程酒店数据累积越来越多。目前流量日数据在3T左右,再加上各种订...
  • 干货传送门

    2017-02-28 16:08:40
    干活传送

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,320
精华内容 3,728
关键字:

干货店