分类 MySQL 下的文章

简介

MySQL 服务器可以在不同的SQL模式下运行, 不同的SQL模式会影响MySQL支持的SQL语法以及它执行的数据验证检查。不同版本的MySQL默认的SQL模式也可能不同。 当前服务的SQL模式是由系统变量 sql_mode 决定的。

在客户端, 可以通过 select @@session.sql_mode 语句查看当前连接的sql_mode ,通过 select @@global.sql_mode 语句查看全局的 sql_mode。 比如:

mysql> select @@session.sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@session.sql_mode                                                                                                                        |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

- 阅读剩余部分 -

准备测试用例

CREATE TABLE `tb_orders_10w` (
  `order_id` bigint(20) NOT NULL COMMENT '订单自增id',
  `order_no` bigint(20) NOT NULL COMMENT '外部订单号',
  `uid` bigint(20) NOT NULL COMMENT '所属用户id',
  `sender_name` varchar(64) DEFAULT '' COMMENT '发件人',
  `sender_mobile` varchar(20) DEFAULT NULL COMMENT '发件人手机',
  `sender_province` varchar(10) DEFAULT '' COMMENT '发件人省',
  `sender_city` varchar(20) DEFAULT '' COMMENT '发件人市',
  `sender_district` varchar(20) DEFAULT '' COMMENT '发件人区',
  `sender_address` varchar(255) DEFAULT '' COMMENT '发件人详细地址',
  `receiver_name` varchar(64) NOT NULL DEFAULT '' COMMENT '收件人名字',
  `receiver_mobile` varchar(20) DEFAULT '' COMMENT '收件人手机',
  `receiver_province` varchar(10) NOT NULL DEFAULT '' COMMENT '收件人省',
  `receiver_city` varchar(20) NOT NULL DEFAULT '' COMMENT '收件人市',
  `receiver_district` varchar(20) NOT NULL DEFAULT '' COMMENT '收件人区',
  `receiver_address` varchar(255) NOT NULL DEFAULT '' COMMENT '收件人详细地址',
  `status` tinyint(1) DEFAULT '0' COMMENT '订单状态:\r\n0未发货,1已取消,\r\n2已发货(有单号),3已完成(有单号)',
  `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  `update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试表';

脚本插入10万条数据。

mysql> SELECT count(*) as cnt FROM tb_orders_10w;
+--------+
| cnt    |
+--------+
| 100000 |
+--------+
1 row in set (0.03 sec)

mysql> 

需求是要随机返回10个订单的 sender_name 。

- 阅读剩余部分 -

1. 停止服务

[root@iZuf6iv3q5dy5wx3gt2oxuZ ~]# service mysql stop
Shutting down MySQL....                                    [  OK  ]
[root@iZuf6iv3q5dy5wx3gt2oxuZ ~]# ps aux|grep mysql
root      6496  0.0  0.0 103312   872 pts/1    S+   17:28   0:00 grep mysql
    

2. 修改配置文件

vi /etc/my.cnf
搜索 [mysqld]
栏目下加入一行 skip-grant-tables

- 阅读剩余部分 -

mysql查询过程

客户端发送一条sql给mysql服务器, 经历了连接器、查询缓存、解析器、预处理器、执行器,最后拿到结果返回给客户端。

image

下面是具体内容:(以下演示基于MySQL5.7.24)

- 阅读剩余部分 -