友儿屋 - mysql
type: channel
link: https://niuzheng.net/tag/mysql/
items: 超详细！ES 安装配置全攻略及 PHP 简单使用
items: 一步到位！Sphinx 安装配置全流程，PHP 轻松对接
items: MySQL 5.7配置主从复制和读写分离
items: CentOS7 Linux 离线安装mysql5.7.39
items: 必知必会！MySQL 核心知识点速览
items: python 知识点汇总 (持续更新中)
items: 用python连接数据库、索引、优化、事务
items: mysql变量声明、存储过程、触发器
items: mysql CRUD操作
items: mysql 常用的数据类型

超详细！ES 安装配置全攻略及 PHP 简单使用
type: item
date: 2025-02-28T15:23:00+08:00
description: 遭遇了 “黑天鹅” 事件近期真是遭遇了 “黑天鹅” 事件，公司因卷入非法问题，面临一系列棘手处理，无奈之下只得遣散全体员工，我也因此瞬间失业。原本按部就班的工作节奏戛然而止，每天醒来，看着毫无安排的一天，心里满是茫然与失落。与其在这种不确定中焦虑徘徊，倒不如主动出击，给自己找点事儿做。我打算投身到文档撰写中，既能有效填补空闲时间，让生活重回正轨，也能借此梳理过往积累的知识与经验，为未来求职筑牢根基，让这段意外失业的日子，不至于虚度 。回顾上一篇我们一同探索了 Sphinx 这个强大的全文搜索引擎，从它的功能特性到安装配置，相信大家对如何利用 Sphinx 搭建高效搜索系统有了清晰认知。不过技术的世界从不止步，在搜索领域，还有一位 “大咖”——Elasticsearch（简称 ES），它凭借分布式、高扩展、实时搜索等卓越优势，在企业级应用中大放异彩。这一篇，就让我们把目光聚焦 ES，深入剖析它的安装配置流程，探寻如何在 PHP 开发环境里，巧妙借助 ES 的力量，实现更智能、更高速的数据检索，解锁不一样的搜索体验。什么是Elasticsearch？它有什么优缺点？和 sphinx 相比，差异在哪里？Elasticsearch 是基于 Lucene 的分布式开源搜索引擎，用于全文搜索、数据分析等。优点是分布式、实时性强、功能丰富。缺点是硬件要求高、索引维护成本高。与 Sphinx 相比，ES 分布式和扩展性更好，功能更全面；Sphinx 在特定场景性能较好，配置相对简单，更适合中小规模数据。安装和配置Elasticsearch官网下载地址服务器：CentOS7,Java版本21.0.2(Elasticsearch基于Java开发)没有Java环境的自行去下载合适的版本，并把java加到环境变量中。sudo vim /etc/profile export JAVA_HOME=/www/server/java/jdk-21.0.2 export PATH=$JAVA_HOME/bin:$PATH安装# 创建存放Elasticsearch软件目录 mkdir -p /usr/local/es/ # 进入/usr/local/es/文件夹 cd /usr/local/es/ # 下载对应的glibc版本的sphinx软件包 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.17.2-linux-x86_64.tar.gz # 解压 tar -zxvf elasticsearch-8.17.2-linux-x86_64.tar.gz # es 禁止以root用户运行，所以我们创建一个组和用户，用于启动es # 创建组 elasticsearch groupadd elasticsearch # 创建用户，指定用户所在的组 useradd youer -g elasticsearch # 设置用户密码 passwd youer配置# 进入/usr/local/es/elasticsearch-8.17.2/config 配置目录，修改以下配置 cd /usr/local/es/elasticsearch-8.17.2/config vim elasticsearch.yml # 找到以下配置并且修改 =============================================================================== # 集群名称，用于标识一个 Elasticsearch 集群， # 同一集群内的节点需要具有相同的集群名称才能相互通信并组成集群。 # 这里设置为 "my-es"，你可以根据实际情况修改为合适的名称。 cluster.name: my-es # 节点名称，用于在集群中唯一标识一个节点。 # 每个节点都应有一个独特的名称，这里设置为 "node-1"， # 可以根据实际需求进行调整。 node.name: node-1 # 绑定的网络地址，"0.0.0.0" 表示该节点将监听所有可用的网络接口， # 使得其他机器可以通过网络访问该 Elasticsearch 节点。 # 这在生产环境中需要谨慎配置，以确保安全性。 network.host: 0.0.0.0 # HTTP 服务端口，Elasticsearch 通过此端口提供 HTTP 接口供外部访问， # 这里设置为 9200，是 Elasticsearch 默认的 HTTP 端口， # 可根据实际情况修改，但要避免与其他服务端口冲突。 http.port: 9200 # 种子节点列表，用于在节点启动时发现集群中的其他节点。 # 这里指定了 "1…

一步到位！Sphinx 安装配置全流程，PHP 轻松对接
type: item
date: 2025-02-28T13:11:00+08:00
description: 遭遇了 “黑天鹅” 事件近期真是遭遇了 “黑天鹅” 事件，公司因卷入非法问题，面临一系列棘手处理，无奈之下只得遣散全体员工，我也因此瞬间失业。原本按部就班的工作节奏戛然而止，每天醒来，看着毫无安排的一天，心里满是茫然与失落。与其在这种不确定中焦虑徘徊，倒不如主动出击，给自己找点事儿做。我打算投身到文档撰写中，既能有效填补空闲时间，让生活重回正轨，也能借此梳理过往积累的知识与经验，为未来求职筑牢根基，让这段意外失业的日子，不至于虚度 。什么是Sphinx? 有什么优缺点呢？phinx 是开源全文搜索引擎。优点是高性能、功能丰富、可扩展性好、多语言支持、开源成本低；缺点是配置复杂、对内存要求高、实时性有限、缺乏图形化管理界面。安装和配置sphinx官网下载页面服务器：CentOS7，glibc版本2.17安装# 创建存放sphinx软件目录 mkdir -p /usr/local/sphinx/ # 进入/usr/local/sphinx/文件夹 cd /usr/local/sphinx/ # 下载对应的glibc版本的sphinx软件包 wget https://sphinxsearch.com/files/sphinx-3.7.1-da9f8a4-linux-amd64-glibc2.17.tar.gz # 解压 tar -zxvf sphinx-3.7.1-da9f8a4-linux-amd64-glibc2.17.tar.gz配置# 进入到配置目录 cd /usr/local/sphinx/sphinx-3.7.1/etc/ # 创建文件，把配置粘贴进去 vim sphinx.conf ====================================================== # 通用配置部分，定义一些全局的设置 common { # 数据目录，用于存放索引文件和其他相关数据 datadir = ./sphinxdata } # 数据源配置，这里以 MySQL 数据库为例 source names_1_source { # 数据源类型为 MySQL type = mysql # 数据库主机地址，使用 127.0.0.1 以确保端口配置生效 sql_host = 127.0.0.1 # 数据库用户名 sql_user = active # 数据库密码 sql_pass = PcjcrN53sR8bdZyx # 要连接的数据库名 sql_db = active # 数据库端口号，默认是 3306 sql_port = 3306 # SQL 查询语句，用于从数据库中获取要索引的数据 sql_query = SELECT id, surname, name, first, second, gender, type, score, details FROM names_1 # 在执行查询前设置字符集为 UTF-8，确保中文等字符能正确处理 sql_query_pre = SET NAMES utf8mb4 } # 索引配置 index names_1_index { # 索引类型为普通索引 type = plain # 关联的数据源 source = names_1_source # 要进行全文搜索的字段 field = surname, details # 定义属性，用于排序、过滤等操作 attr_uint = gender, type # 无符号整数类型的属性 attr_float = score # 浮点数类型的属性 attr_string = name, first, second # 字符串类型的属性 # 字符集表，涵盖了数字、英文字母（大小写统一）、中文、日文、韩文等字符范围 # charset_table = # 最小词长度，设置为 1 表示单字符也会被索引，适用于中文和单字母搜索 min_word_len = 1 # 词形处理方式，这里设置为不进行词形处理 morphology = none # N - gram 长度，设置为 1 表示按单字符进行 N - gram 索引，有助于中文搜索 ngram_len = 1 # 指定用于 N - gram 索引的字符范围，这里包含了中文、日文、韩文等字符 ngram_chars = U+4E00..U+9FBB, U+3400..U+4DB5, U+20000..U+2A6D6, U+FA0E, U+FA0F, U+FA11, U+FA13, U+FA14, U+FA1F, U+FA21, U+FA23, U+FA24, U+FA27, U+FA28, U+FA29, U+3105..U+312C, U+31A0..U+31B7, U+3041, U+304…

MySQL 5.7配置主从复制和读写分离
type: item
date: 2024-03-14T09:54:00+08:00
description: 安装mysqlCentOS7 单机配置mysql多实例运行环境说明CentOS7、mysql5.7mysql服务器master host:127.0.0.1 port:3306slave 1 host:127.0.0.1 port:3307slave 2 host:127.0.0.1 port:3308主从配置原理① 当master节点接收到一个用户写请求时，这个写请求可能是增删改操作，此时会把写请求的操作都记录到binlog日志中。② 首先slave节点通过配置信息连接到master节点上，当slave节点连接到master节点上时，master节点会为每一个slave节点分别创建一个binlog dump线程，用于向每个slave节点发送binlog日志。③ 此时，binlog dump线程会读取master节点上的binlog日志，然后将binlog日志发送给slave节点上的I/O线程。④ slave几点上的I/O线程接收到binlog日之后，会将文件名、路径、密码等信息保存到master.info中，会将binlog日志先写入到本地的relaylog中，relaylog中就保存了master的binlog日志。⑤ 最后，slave节点上的SQL线程会读取relaylog中的biinlog日志，将其解析成具体的增删改操作，把这些在master节点上进行过的操作，重新在slave节点上也重做一遍，打到数据还原的效果，这样就可以保证master节点和slave节点的数据一致性了。master配置# 查看当前的二进制日志记录状态 root@(localhost) 01:23:33>SHOW VARIABLES like 'log_bin'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_bin | ON | +---------------+-------+ 1 row in set (0.00 sec) # 创建用于从服务器连接的用户 # 刷新权限 FLUSH PRIVILEGES; # 创建用户 CREATE USER 'synchronous'@'%' IDENTIFIED by 'synchronous'; # 授予'synchronous'用户复制从服务器的权限 GRANT REPLICATION SLAVE ON *.* TO 'synchronous'@'%' IDENTIFIED WITH mysql_native_password BY 'synchronous'; # 刷新权限 FLUSH PRIVILEGES; # 查看主服务器的状态，包括二进制日志文件名和位置 root@(localhost) 01:23:44>show MASTER status; +-----------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-----------------------+----------+--------------+------------------+-------------------+ | mysql-3306-bin.000003 | 1757 | | | | +-----------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)slave 1 从服务器 # 添加主服务器信息 CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_PORT=3306, MASTER_USER="synchronous", MASTER_PASSWORD="synchronous", MASTER_LOG_FILE="mysql-3306-bin.000003", MASTER_LOG_POS=1757; # 开启从服务器 start SLAVE; # 查看从服务器状态 root@(localhost) 01:41:00>SHOW SLAVE STATUS\G; *************************** 1. row *************************** Slave_IO_State: Waiting …

CentOS7 Linux 离线安装mysql5.7.39
type: item
date: 2024-03-07T16:49:00+08:00
description: 下载 MySQL 5.7 的安装包首先，需要从 MySQL 官方网站或其他可靠来源下载 MySQL 5.7 的安装包。确保选择与你的 CentOS 系统架构（如 x86_64）对应的版本。操作系统内核的版本号[root@localhost mysql]# uname -r 3.10.0-1160.108.1.el7.x86_64 操作系统的版本信息NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="CentOS Linux 7 (Core)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:7" HOME_URL="https://www.centos.org/" BUG_REPORT_URL="https://bugs.centos.org/" CENTOS_MANTISBT_PROJECT="CentOS-7" CENTOS_MANTISBT_PROJECT_VERSION="7" REDHAT_SUPPORT_PRODUCT="centos" REDHAT_SUPPORT_PRODUCT_VERSION="7" 官网下载页面地址Product Version : 5.7.39Operating System : Linux GenericOS Version : Generic (glibc 2.12) (x86, 64-bit)mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz 下载链接 安装为mysql创建单独的属组、用户、创建安装目录# 查看用户、组 是否存在 cat /etc/passwd |grep mysql cat /etc/group |grep mysql # 删除用户 userdel mysql # 创建组 groupadd mysql # 创建一个名为mysql的系统用户，该用户属于mysql组，不能登录到系统，确保只有数据库服务器可以访问 MySQL 数据库 # -r 表示创建一个系统用户，该用户不能用于登录系统 # -g 指定用户所属的主组 # 指定用户的登录 shell 为 /sbin/nologin，这意味着该用户不能通过 SSH 或控制台登录到系统 useradd -r -g mysql mysql -s /sbin/nologin # 创建安装目录 mkdir /usr/local/mysql 下载、解压、移动至安装目录# 下载mysql 安装包到root 目录 wget -P /root/ https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz # 解压 cd /root/ && tar -zxvf mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz # 移动到mysql安装目录 mv /root/mysql-5.7.39-linux-glibc2.12-x86_64/* /usr/local/mysql/mysql 配置创建所需目录# 创建数据存储目录 mkdir /usr/local/mysql/data/ # 创建数据日志目录 mkdir /usr/local/mysql/log/ # 创建临时文件目录 mkdir /usr/local/mysql/tmp/ # 创建运行文件目录 mkdir /usr/local/mysql/run/ # 创建启动错误日志 touch /usr/local/mysql/log/mysqld_safe_error.log # 创建默认的错误日志目的地 touch /usr/local/mysql/log/alert.log # 创建慢查询日志文件 touch /usr/local/mysql/log/slow.log # 创建通用查询日志文件的 touch /usr/local/mysql/log/general.log 创建、配置文件 vim /etc/my.cnf # mysqld_safe脚本启动时读取的配置 [mysqld_safe] # 存放 MySQL 后台程序 pid 的文件位置 pid-file=/usr/local/mysql/run/mysqld.pid # 启动错误日志 log-error=/usr/local/mysql/log/mysqld_safe_error.log # 本地 mysql 客户端程序的配置块 [mysql] #…

必知必会！MySQL 核心知识点速览
type: item
date: 2024-02-20T15:56:00+08:00
description: [scode type="green"]mysql索引的本质是什么[/scode][collapse title="点击展开" status="false"]1、其实就相当于目录，是帮助mysql高效获取数据的数据结构。2、我们都知道，在mysql中数据最终存储在硬盘中的，访问磁盘相当于是I/O操作。3、在mysql中有一个page的概念，一个表都被分为若干个页面(page),每个页面(page)就是树中的一个节点，每次mysql就会取出一个页面(page)也就是一个节点的数据，而mysql默认一个页面(page)保存16k的数据。4、页面(page)的大小会直接影响到数据的存储和检索效率，因此我们也可以实际业务需求和硬件条件进行评估和调整，合理设置mysql的页面(page)大小，以达到最佳的性能表现。[/collapse][scode type="green"]mysql的索引常见分类以及操作索引的语法[/scode][collapse title="点击展开" status="false"]主键索引主键索引是一种特殊的索引类型，它是用于唯一标识每一行数据的索引，每个表只能有一个主键索引，索引列中的值必须是唯一的，不允许有空值。复合索引(又称为联合索引)复合索引也叫多列索引或联合索引，它是包含多个列的索引类型，能够加速多列查询和排序操作。需要遵循最左前缀匹配原则（最左匹配原则）普通索引MySQL中基本索引类型，没有什么限制，允许在定义索引的列中插入重复值和空值。唯一索引唯一索引是用来保证列的唯一性的索引，一个表可以有多个唯一索引。索引列中的值必须是唯一的，但是允许为空值。全文索引全文索引是一种用于全文搜索的索引类型，能够对文本数据进行快速的模糊搜索和关键字搜索。只能在文本类型CHAR,VARCHAR,TEXT类型字段上创建全文索引。哈希索引哈希索引是基于哈希表实现的索引类型，能够对等值查询进行高效的处理，但不支持范围查询和排序，MySQL 中 Memory 引擎中支持哈希索引。索引操作新建表中添加索引CREATE TABLE 表名 ( 主键字段名 数据类型 [完整性约束条件] PRIMARY KEY, 字段名 数据类型 [完整性约束条件], [UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY [索引名](字段名1 [(长度)] [ASC | DESC]) ); 注解： UNIQUE：可选。表示索引为唯一性索引。 FULLTEXT；可选。表示索引为全文索引。 SPATIAL：可选。表示索引为空间索引。 INDEX和KEY：用于指定字段为索引，两者选择其中之一就可以了，作用是一样的。 索引名：可选。给创建的索引取一个新名称。 字段名1：指定索引对应的字段的名称，该字段必须是前面定义好的字段。 长度：可选。指索引的长度，必须是字符串类型才可以使用。 ASC：可选。表示升序排列。 DESC：可选。表示降序排列。在已建表中添加索引CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX 索引名 ON 表名(字段名)以修改表的方式添加索引ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL | INDEX | KEY | PRIMARY KEY] 索引名(字段名)[/collapse][scode type="green"]介绍一个数据模型可视化网站有助于对mysql索引模型数据结构的了解 数据模型可视化网站[/scode][scode type="green"]索引的数据类型[/scode][tabs][tab type="primary" name="二叉树" active="true"]二叉树 (简称：BST树,全称：Binary Search Trees)一、特点1、左子树的所有值都小于根节点2、右子树的所有值都大于根节点3、每个根节点最多分列出两个子节点二、模型1、如图1所示，如果我们要查询9，首先从根节点10查询，9小于10，走左节点8，9大于8，走右节点9，因为每个节点就是一次I/O查询，相当于进行了3次I/O查询。2、如图2所示，二叉树有一种极端情况，假如从小到大依次向树中插入的情况就会形成一个链表的形式，我们这时候要查询9时，至少需要9次IO操作，相当于遍历了整个表，I/O次数可想而知。为了避免这个问题呢？就有了平衡二叉树。[/tab][tab type="success" name="平衡二叉树"]平衡二叉树 (简称：AVL树,全称：Balanced binary search trees)一、特点1、相对平衡，左右两个子树的深度差绝对值不能超过12、左右两个子树也必须是平衡二叉树3、避免了二叉树的极端情况二、模型…

python 知识点汇总 (持续更新中)
type: item
date: 2022-09-21T10:50:00+08:00
description: 1.python 基础知识[post cid="2855" title="python 变量与数据类型(1.0)" /][post cid="2859" title="python 函数、运算符以及运算符优先级(2.1)" /][post cid="2857" title="python 字符串(字符序列)和字节序列(2.2)" /][post cid="2858" title="python 四大基础数据结构()及操作(2.3)" /][post cid="2863" title="python 流程、循环、异常、函数的高级用法(3.0)" /][post cid="2866" title="python 内置、匿名、高阶、递归等函数(3.1)" /][post cid="2869" title="python 作用域、闭包、装饰器(3.2)" /]2.python 进阶知识[post cid="2870" title="python 模块、time、datetime 导入使用(4.0)" /][post cid="2871" title="python 类的创建, 实例化, 初始化以及面向对象(4.1)" /][post cid="2872" title="python 类属性和实例属性、类方法, 静态方法, 实例方法、接口, 协议和抽象基类 (4.2)" /][post cid="2899" title="python的requests模块的介绍、多线程和多进程(5.0)" /][post cid="2901" title="python 进程间通信(IPC)(5.1)" /][post cid="2905" title="python 迭代器和生成器(5.2)" /]3.python TCP-IP协议相关与抓包[post cid="2911" title="输入网址后发生了什么? TCP/IP五层协议?" /][post cid="2917" title="理解TCP/IP协议、三次握手、四次挥手、HTTPS" /][post cid="2921" title="抓包、模拟请求" /]4.python 数据库相关[post cid="2928" title="数据库的基本介绍" /][post cid="2932" title="mysql 常用的数据类型" /][post cid="2933" title="mysql CRUD操作" /][post cid="2939" title="Mysql约束、分组查询" /][post cid="2940" title="mysql变量声明、存储过程、触发器" /][post cid="2941" title="用python连接数据库、索引、优化、事务" /]5.python 前端基础知识与爬虫相关[post cid="2952" title="一个请求的组成、静态页面和动态页面、HTML, CSS和JS、浏览器渲染的过程" /][post cid="2953" title="了解元素定位css-selector 、Python库BeautifulSoup 等" /][post cid="2956" title="一个小又全的爬虫项目包含哪些部" /]6.python Scrapy框架相关[post cid="2960" title="python 路径管理以及常见报错" /][post cid="2961" title="Scrapy爬虫框架介绍" /][post cid="2962" title="Scrapy的启动和debug、 Item、设置、中间件" /][post cid="2972" title="Scrapy的Meta、异常处理" /][post cid="2973" title="redis介绍、安装以及数据类型" /][post cid="2976" title="python 分布式爬虫" /][post cid="2977" title="Selenium 简单介绍、安装、启动" /]7.python Django 框架相关8.python 服务器与项目部署9.python JavaScript相关10.python JS加密相关11.python 数据结构与常用算法12.python 面试内容13.python 爬虫进阶

用python连接数据库、索引、优化、事务
type: item
date: 2022-09-06T15:43:00+08:00
description: 用python的pymysql包连接数据库pymysqlpip install pymysql #如果让你装vs环境, 执行以下命令升级pip即可 python -m pip install --upgrade pip连接数据库数据库设置MYSQL_CONF = { "host": "127.0.0.1", "user": "root", "password": "qwe369", "db": "test" }连接# 连接数据库 mysql_con = pymysql.connect(**MYSQL_CONF) # 简单理解真正执行语句的线程 mysql_cursor = mysql_con.cursor()执行SQL语句单条执行执行时间15.31s@clock_it_deco def insert_one(): for i in range(10**4): store_name = f"店铺_{i}" amount = format(random.uniform(10**3, 10**6), '.2f') department = f"事业部_{random.randint(1, 10)}" sta_date = time.strftime("%Y-%m-%d") SQL = f"""INSERT INTO store_perf(store_name, amount, department, sta_date) VALUES ('{store_name}', {amount}, '{department}', '{sta_date}')""" print(SQL) mysql_cursor.execute(SQL) # 显示执行commit, 避免cursor执行, 但是数据库未收到的执行指令的情况 mysql_con.commit()多条执行如果其中有一条记录报错, 那么整个values插入都会失败@clock_it_deco def insert_many(): values = [] for i in range(10**4): store_name = f"店铺_{i}" amount = format(random.uniform(10**3, 10**6), '.2f') department = f"事业部_{random.randint(1, 10)}" sta_date = time.strftime("%Y-%m-%d") values.append((store_name, amount, department, sta_date)) SQL = """INSERT INTO store_perf(store_name, amount, department, sta_date) VALUES (%s, %s, %s, %s)""" print(values) mysql_cursor.executemany(SQL, values) mysql_con.commit()获取返回值def get_shops(): SQL = "select store_name, amount, sta_date from store_perf where department='事业部_1' LIMIT 2" mysql_cursor.execute(SQL) # 获取返回值 query_set = mysql_cursor.fetchall() data_dict = [] for field in mysql_cursor.description: data_dict.append(field[0]) mysql_cursor.close() print(query_set,data_dict)返回的是一个元组, 元组中表示记录的也是一个元组(('店铺_1', Decimal('823471.56'), '2021-02-06'), ('店铺_6', Decimal('726927.02'), '2021-02-06'))索引和优化创建索引未建索引: 0.287s建了索引后: 0.016s设置索引的字段不可以超过191个字符长度, 也就是767个bytesCREATE INDEX 索引名 ON 表名(字段1, 字段2...) CREATE INDEX store_name_index ON store_perf(store_name)创建联合索引CREATE INDEX store_name_sta_date_department_index ON store_perf(store_name, sta_date, department)查看索引SHOW INDEX FROM store_perf删除索引ALTER…

mysql变量声明、存储过程、触发器
type: item
date: 2022-09-06T15:41:00+08:00
description: 变量声明服务器系统变量通过@@来调用系统变量# 列出mysql所有系统变量 SHOW VARIABLES SELECT @@date_format用户变量通过@来调用用户变量# 输出变量yesterday SELECT @yesterday # 对变量yesterday进行赋值 SET @yesterday=subdate(CURRENT_DATE, 1); # 日期的格式化 SET @yesterday=DATE_FORMAT(@yesterday, "%Y/%m/%d"); # 小数的格式化 SET @amount=0.4; SET @amount=CAST(@amount as DECIMAL(15, 3)); SELECT @amount局部变量不需要@前缀需要事先进行变量类型的声明和初始化存储过程简单地认为是SQL中的函数声明一个存储过程创建存储过程每一句语句结束之后都要添加分号;CREATE PROCEDURE stat_store_perf(days INT) BEGIN DECLARE t_date VARCHAR(255); set t_date = DATE_FORMAT(subdate(CURRENT_DATE, days), '%Y-%m-%d'); SELECT count(*) as 店铺数, FORMAT(AVG(amount), 2) as 平均业绩, SUM(amount) as 总业绩, MAX(amount) as 最大业绩, MIN(amount) as 最小业绩, department as 部门 FROM store_perf WHERE sta_date=t_date GROUP BY department; END调用存储过程CALL stat_store_perf(1)删除存储过程DROP PROCEDURE stat_store_perf触发器和存储过程一样, 都是嵌入到mysql中的一段程序, 区别就是存储过程需要显式调用, 而触发器式根据对表的相关操作自动激活执行.创建触发器CREATE TRIGGER 触发器名 BEFORE[AFTER] [INSERT, UPDATE, DELETE] CREATE TRIGGER check_department BEFORE INSERT ON store_perf FOR each row BEGIN IF new.department not in ("男装事业部", "女装事业部") THEN SET new.department 'unknow'; END IF; END触发器的应用多用来检查字段查看触发器建议通过客户端删除SHOW TRIGGERS FROM store_perf删除触发器建议通过客户端删除DROP TRIGGERS check_department

mysql CRUD操作
type: item
date: 2022-09-06T15:25:00+08:00
description: 创建表的时候尽量加上create_time字段, 为create_time设置默认值CURRENT_TIMESTAMPCRUD操作Create(增)单条插入INSERT INTO 表名(字段1, 字段2..) VALUES(值1, 值2) INSERT INTO class_1(name) VALUES('name_1')多条插入INSERT INTO 表名(字段1, 字段2..) VALUES(值1, 值2), (值1, 值2)Retrieve(查)获取所有记录SELECT 字段1, 字段2 FROM 表名 SELECT name FROM class_1 SELECT * FROM class_1条件查询(WHERE, AND , OR)SELECT 字段1, 字段2 FROM 表名 WHERE 表达式 SELECT * FROM class_1 WHERE name="name_1" AND id=8模糊匹配(LIKE, %)模糊匹配有性能问题, 表记录如果比较多, 查询速度很慢SELECT 字段1, 字段2 FROM 表名 WHERE 表达式 SELECT * FROM class_1 WHERE name LIKE "%m%" 限制返回条数(LIMIT)查询表达式 LIMIT 数量过滤重复值(DISTINCT)对查询的结果进行过滤.如果指定多个字段, 会对多个字段联合进行过滤SELECT DISTINCT 字段1, 字段2 FROM 表名 [条件语句] SELECT distinct name, create_time FROM class_1 WHERE name like '%m%'排序问题对查询的结果进行排序升序(ASC)数据库默认是升序的查询表达式 ORDER BY 字段 ASC降序(DESC)查询表达式 ORDER BY 字段 DESC获取查询结果的条数(COUNT)SELECT COUNT(*) FROM 表名 [条件语句]Update(更新)UPDATE 表名 SET 字段1=新值, 字段2=新值 WHERE 表达式 UPDATE class_1 SET name='name_0' WHERE id=8Delete(删除)DELETE FROM 表名 WHERE 表达式 DELETE FROM class_1 WHERE name='name_0'集合操作并集UNION子语句SELECT 必须拥有相同数量的列(字段), 且列的数据类型也相同SELECT name from class_1 WHERE name is not NULL UNION SELECT name from class_2 WHERE name is not NULL交集(JOIN, INNER JOIN)SELECT s1.name FROM (SELECT name from class_1 WHERE name is not NULL) as s1 JOIN (SELECT name from class_2 WHERE name is not NULL) as s2 ON s1.name=s2.name差集(LEFT JOIN, RIGHT JOIN)A对B的差集(LEFT JOIN)SELECT * FROM // s1对s2的差集, select就可以使用s1.name (SELECT name from class_1 WHERE name is not NULL) as s1 LEFT JOIN (SELECT name from class_2 WHERE name is not NULL) as s2 ON s1.name=s2.name WHERE s2.name is NULL // 限定s1有, s2没有的记录B对A的差集(RIGHT JOIN)SELECT * FROM (SELECT name from class_1 WHERE name is not NULL) as s1 RIGHT JOIN (SELECT name from class_2 WHERE name is not NULL) as s2 ON s1.name=s2.name WHERE s1.name is NULL补集A与B的补集 = A与B的并集 - A与B的交集A与B的补集 = A对B的差集 + B对A的差集 √SELECT s1.name FROM (SELECT name from class_1 WHERE name is not NULL) as s1 LEFT JOIN (SELECT name from class_2 WHERE name is not NULL) as s2 ON s1.name=s2.nam…

mysql 常用的数据类型
type: item
date: 2022-09-06T15:24:00+08:00
description: 常用的数据类型int数字范围-2**32 ~ 2**32-1bigint数字范围-2**63 ~ 2 ** 63-1floatfloat(m,d), 其中m表示的是有效位, d表示小数位 有效位就是把当前的小数: 12345.12 转变成科学计数法: 1.234512 * 10**5 m最大值为7doubledouble(m, d), 其中m表示的是有效位, d表示小数位 m的最大值为15decimal涉及金额的时候使用decimal.double(m, d), 其中m表示的是有效位, d表示小数位 m的最大值为65 不会产生精度问题, 因为decimal没有精度损失的本质是因为它存的是字符串.char表示固定长度的字符串, 长度为255个字节中文字符占据3~4个字节varchar表示不定长的字符串, 长度为0~65535个字节TEXT长文本类型, 最大长度占据64kbdatetime如果当前时区发生更改, datetime类型不会发生更改, 与存入的日期保持一致.timestamp如果当前时区发生更改, timestamp类型会跟着时区更改.常用的运算符算术运算符+-*/div取商SELECT 5 div 3mod取余SELECT 5 mod 3比较运算符=类似python中的 == SELECT 1 =1!=> 与>=<与<=between 与not betweenSELECT 2 not between 1 and 3is null 与 is not null用来判断当前是否有记录逻辑运算符NOTANDORXOR(了解)异或, 两个值一个True, 一个为False, 当前表达式才为True常用的函数算术运算SUM和AVG平均数MAX和MIN对字符串进行操作时, 类似python的排序, 是根据ascii码来排序的.COUNT计算当前记录数 SELECT count(*) from test字符处理CHAR_LENGTHSELECT CHAR_LENGTH("test")FORMAT格式化SELECT FORMAT(0.333333,2)LEFT和RIGHTSELECT right("abcdefg", 2)TRIMSELECT trim("abcdefg ")