《叶问》第19期

关 于 叶 问

《叶问》是知数堂新设计的互动栏目,不定期给大家提供技术知识小贴士,形式不限,或提问、或讨论均可,并在当天发布答案,让大家轻轻松松利用碎片时间就可以学到最实用的知识点。

2019年09月03日,周二

如何将excel数据导入MySQL表中?

将excel导入MySQL表的方式有很多,这里列举几种平时常用的方法:

1、将excel另存为csv文件,再使用LOAD DATA导入表,命令参考如下:

LOAD DATA INFILE 'c:/tmp/discounts.csv'

INTO TABLE discounts

FIELDS TERMINATED BY ','

ENCLOSED BY '"'

LINES TERMINATED BY '\n'

IGNORE 1 ROWS;

2、利用Navicat、MySQL Workbench等第三方工具进行导入

3、excel利用函数拼接成insert SQL进行数据插入(数据量大时不推荐,效率极低)

4、例行批量导入,安利python的xlwt模块

注意:进行数据导入时注意先执行set names设置字符集,以免造成乱码

2019年09月05日,周四

用xtrabackup跑mysql物理备份,建议授予哪些权限?


可能需要用到以下权限:

1、RELOAD and LOCK TABLES (用于FLUSH TABLES WITH READ LOCK 和 FLUSH ENGINE LOGS)

2、BACKUP_ADMIN (用于查询表performance_schema.log_status, 执行LOCK INSTANCE FOR BACKUP, LOCK BINLOG FOR BACKUP, 或 LOCK TABLES FOR BACKUP)

3、REPLICATION CLIENT(获取一致性位点)

4、PROCESS(用于执行SHOW ENGINE INNODB STATUS或者查看线程状态等)

5、SUPER(复制环境下用于start/stop the slave threads)

6、SELECT(使用选项--incremental-history-name or --incremental-history-uuid时获取innodb_to_lsn插入到PERCONA_SCHEMA.xtrabackup_history表)

2019年09月10日,周二

select里用rand(),怎么优化效率?

案例:

select id from t1 where id = round(rand()*13241324);

其中id列是IINT类型的主键

一、问题点

该SQL的问题点主要在于当使用rand()匹配时,实际上是逐行提取数据,rand()每次生成一个随机数进行单行匹配,即如果t1表有100万数据就会匹配100万次,即便有索引也没用,也要全表扫描

二、优化方式

优化方式主要有2种思路,第一种是通过子查询关联,第二种是通过范围查询加limit 1,如下所示:

1、select id from t1 join (select round(rand()*13241324) as id2) as t2 where t1.id = t2.id2

2、select id from t1 where id > (select round(rand()*(select max(id) from t1)) as nid) limit 1

再次提醒,不要用rand()直接进行匹配或者排序,会引发性能灾难

参考:

http://imysql.com/2014/07/04/mysql-optimization-case-rand-optimize.shtml

2019年09月17日,周二

现在业内常用的MySQL高可用方案有哪些?

目前来说,比较多的开源方案分内置高可用与外部实现,内置高可用有如下:

1、官方版本分支:MGR(首推)

2、percona分支:PXC

3、MariaDB:Galera Cluster

外部实现方案:

1、orchestrator(GTID)

2、replication-manager(GTID)

3、MHA(传统复制)

4、MOHA(支持多AZ部署)

5、其他...

2019年09月19日,周四

什么时候MySQL的索引"失效"不可用?

1、通过索引扫描的记录超过20%~30%,可能会变成全表扫描

2、联合索引中,查询条件不符合左侧前导要求

3、查询条件列最左以通配符%开始

4、查询条件发生数据类型隐式转换,或者字符集不匹配

5、HEAP表使用HASH索引时,使用范围检索或者ORDER BY

6、多表关联时,排序字段不属于驱动表,无法利用索引完成排序

7、JOIN查询时,关联列数据类型(字符集)不一致也会导致索引不可用

8、不可见索引,即便force index也不可用

9、违反索引排序规则

详情请戳叶老师公开课:

2019年09月24日,周二

MySQL从库show processlist出现system lock的原因以及解决方法有哪些?

由于大量的小事物如UPDATE/DELETE table where一行数据,这种只包含一行DML event的语句,table是一张大表。

1、这个表上没有主键或者唯一键,可以考虑尝试修改参数slave_rows_search_algorithms。

2、由于类似innodb lock堵塞,也就是slave从库修改了数据同时和sql_thread也在修改同样的数据。

3、确实I/O扛不住了,修改sync_binlog/innodb_flush_log_at_trx_commit或者提高IO子系统的IO能力

友情提示:

MySQL数据库表建议都设置int/bigint的自增主键,"业务主键"设置为not null + 唯一索引

2019年09月27日,周五

周末了来一个轻松的python算法题:有64瓶药,其中63瓶是无毒的,只有一瓶是有毒的。如果小白鼠喝了有毒的药,3天后会死掉,喝了无毒的药,喝了多少瓶都没事。现在只剩下3天时间,请问最少需要多少只小白鼠才能试出哪瓶药有毒?

现在公布正确答案啦:

总共需要六只小白鼠。

6只小白鼠当做二进制的位数,那么小白鼠可以表示从000000 - 111111,也就是十进制的0-63个数,药按照1-64排好号,比如第一瓶药编号1,对应小白鼠000001,最右边的小白鼠喝,以此类推,比如第8瓶药,001000,第三只小白鼠喝。从1-63号药都喝一遍。假如最后死的小白鼠对应二进制是001111,那么是15号药有毒。

 640?wx_fmt=gif

640?wx_fmt=gif
扫码加入QQ技术交流群

(群号:793818397)    

640?wx_fmt=png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import javafx.application.Application; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ComboBox; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.GridPane; import javafx.stage.Stage; public class MovieTicketSystem extends Application { // 创建并初始化折扣对象 Discount[] discounts = { new StudentDiscount(), new ChildrenDiscount(), new VIPDiscount() }; @Override public void start(Stage primaryStage) throws Exception { // 设置窗口标题 primaryStage.setTitle("电影票销售系统"); // 创建Grid布局 GridPane gridPane = new GridPane(); gridPane.setAlignment(Pos.CENTER); gridPane.setHgap(10); gridPane.setVgap(10); // 创建UI控件 Label movieLabel = new Label("选择电影:"); ComboBox<String> movieComboBox = new ComboBox<>(); movieComboBox.getItems().addAll("功夫熊猫", "叶问", "疯狂动物城"); movieComboBox.setValue("功夫熊猫"); Label discountLabel = new Label("选择优惠方式:"); ComboBox<String> discountComboBox = new ComboBox<>(); discountComboBox.getItems().addAll("学生优惠", "儿童优惠", "VIP优惠"); discountComboBox.setValue("学生优惠"); Label priceLabel = new Label("原价:50元"); Label finalPriceLabel = new Label("最终价格:"); TextField finalPriceField = new TextField(); finalPriceField.setEditable(false); Button calculateButton = new Button("计算价格"); calculateButton.setOnAction(e -> { // 获取用户选择的电影和优惠方式 String movie = movieComboBox.getSelectionModel().getSelectedItem(); String discount = discountComboBox.getSelectionModel().getSelectedItem(); // 根据用户选择设置票价和折扣对象 MovieTicket mt = new MovieTicket(); if (movie.equals("功夫熊猫")) { mt.setPrice(60); } else if (movie.equals("叶问")) { mt.setPrice(70); } else if (movie.equals("疯狂动物城")) { mt.setPrice(80); } else { finalPriceField.setText("请选择正确的电影!"); return; } if (discount.equals("学生优惠")) { mt.setDiscount(discounts[0]); } else if (discount.equals("儿童优惠")) { mt.setDiscount(discounts[1]); } else if (discount.equals("VIP优惠")) { mt.setDiscount(discounts[2]); } double price = mt.getPrice(); finalPriceField.setText(price + "元"); }); // 添加UI控件到Grid布局中 gridPane.add(movieLabel, 0, 0); gridPane.add(movieComboBox, 1, 0); gridPane.add(discountLabel, 0, 1); gridPane.add(discountComboBox, 1, 1); gridPane.add(priceLabel, 0, 2); gridPane.add(finalPriceLabel, 0, 3); gridPane.add(finalPriceField, 1, 3); gridPane.add(calculateButton, 0, 4, 2, 1); // 创建场景并将Grid布局添加到场景中 Scene scene = new Scene(gridPane, 400, 250); primaryStage.setScene(scene); // 显示窗口 primaryStage.show(); } public static void main(String[] args) { launch(args); }把这段代码的电影票原价改成随选择的电影变化而变化
06-13

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值