Mysql
潘广宇
主攻Golang|Python|PHP|数据库|高并发架构|人工智能,Base广州,博客主要写一些工作上遇到的问题和处理经验
展开
-
MySQL BTree 与 B+Tree 的原理和区别
系统从磁盘读取数据到内存时是以磁盘块 block 为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么。InnoDB存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位。InnoDB存储引擎中默认每个页的大小为16KB,可通过参数innodb_page_size将页的大小设置为4K、8K、16K一、BTree每个节点占用一个盘块的磁盘空间,一个节点上有两个升序排序的关键字和三个指向子树根节点的指针,指针存储的是子节点所在磁盘块的地址。每个磁盘块存储.原创 2022-05-12 19:51:35 · 81 阅读 · 0 评论 -
MySQL 出现数据库表被锁解决方案
一、出现的现象页面出现502错误,数据库CPU持续飙升,大量事务堆积未提交成功(事务一直处于阻塞阶段)查看阻塞事务列表,发现其中有锁表现象。二、排查与解决思路1)查看数据库中是否有表被锁show open tables where in_use > 0;如果上述返回有结果,说明有表正在被使用,返回字段如下| Database | Table | In_use | Name_locked |2)查看进程(只会显示当前用户的进程,除非是root用户)show pr.原创 2022-05-04 19:41:13 · 12045 阅读 · 0 评论 -
重复的 Delete 语句导致 MySQL Deadlock
如果某条delete语句带有where条件,执行时间较长,并发执行相同查询条件的该语句会产生Deadlock死锁,解决方案:引入Redis加入锁机制举个例子:<?phpfunction myconf() { $sql = "delete * from test where field1 = '{$field1}' and field2 = '{$field2}'"; $lock = "delete_lock_" . md5($field1 . $field2)原创 2021-12-29 14:31:48 · 828 阅读 · 0 评论 -
MySQL 通过正则表达式 REGEXP 查询字符串交集
问题:有一个字符串 china,america,japan需求:判断数据库中有哪些记录是有包含上述字符串(china,america,japan)其中一个国家的,比如包含 china 或者 america 或者 japan 都为 true数据库数据:id country_scope 1 china,korea,spanish 2 mexico,italiy 3 japan,france,russia 4 korea,turkey 最常见的原创 2021-12-08 15:14:14 · 640 阅读 · 0 评论 -
Mysql NULL值判断:is NULL 和 = NULL 区别
原表数据:id | status1 (NULL)2 (NULL)先看两个例子:SELECT id,status FROM test WHERE status = NULL;这种情况返回了空,即使改成:SELECT id,status FROM test WHERE status != 1;// 正确写法 != 1 不能筛选NULL这种特殊类型的。应改成 WHERE IFNULL(status, '') != 1;或SELECT id,status...原创 2021-08-19 16:17:36 · 1465 阅读 · 0 评论 -
MySQL 添加索引报错:BLOB/TEXT column used in key specification without a key length
当我们对一个名称为platform的字段,类型为 text 添加索引时,会报错:BLOB/TEXT column 'platform' used in key specification without a key length这样的错误,同样存在于将某个字段从 varchar 修改成 text,而该字段此前已经存在索引原因:MySQL只能将BLOB/TEXT类型字段设置索引数据的前N个字符,因此,只需要通过sql在增加索引时指定对应字段的长度即可,如:ALTER TABLE hello_原创 2020-08-21 16:00:15 · 5829 阅读 · 1 评论 -
Host 'xx' is not allowed to connect to this MySQL server 处理
使用命令行连接 docker 中的 mysql 时:mysql -h127.0.0.1 -P3310 -uroot -p会报错:Host '172.22.0.1' is not allowed to connect to this MySQL server在容器中能正常进入 mysql,但是容器外无法连接进入经排查,其实是MySQL默认不允许远程登录,需要进入docke...原创 2020-05-06 16:59:42 · 723 阅读 · 0 评论 -
Centos 上 Percona-toolkit 安装方式
一、官网下载 rpm 包,可用迅雷下载再上传到服务器官网:https://www.percona.com/downloads/percona-toolkit/LATEST/yum install https://www.percona.com/downloads/percona-toolkit/3.2.0/binary/redhat/7/x86_64/percona-toolkit-3....原创 2020-05-05 14:36:24 · 909 阅读 · 0 评论 -
Mysql8.0 pt-online-schema-change 报错处理
执行命令:pt-online-schema-change D=test,t=test_a,h=127.0.0.1 -u root -P 3309 --ask-pass --alter="ADD COLUMN address varchar(100)" --alter-foreign-keys-method=auto --execute# 在线修改表结构发现报错:There is ...原创 2020-05-05 14:33:01 · 928 阅读 · 3 评论 -
Mysql 字段大小写区分的问题
如使用IN查询某个字段的值时,会遇到大小写不区分的情况,如:select * from test where name in ('xiaoming')此时,XiaoMing , Xiaoming , xiaoMing会被查找出来,如果只想查找 xiaoming 严格大小写区分的,就需要修改字段的字符编码。如,varchar默认是不区分大小写,需要让该字段编码修改成 *_bin 类型的...原创 2019-12-27 20:43:17 · 259 阅读 · 0 评论 -
SQL group by 取最新一条数据
如现有数据:id | name | time1 | aaa | 15662049582 | aaa | 15662049673 | aaa | 15662049894 | bbb | 15662049585 | bbb | 15662049676 | bbb | 15662049897 | ccc | 15662049588 | ccc | 15662049679 | c...原创 2019-08-19 17:01:40 · 8617 阅读 · 2 评论 -
MySQL 报错 :Syntax error or access violation: 1064
首先检查语句是否有问题,如果发现语句没有问题,最常见的错误就是字段使用了mysql的关键词。如:CREATE TABLE `A` ( `id` bigint(20) UNSIGNED NOT NULL COMMENT 'id', ... `index` text NOT NULL COMMENT '索引') ENGINE=InnoDB DEFAULT CHARSET=utf...原创 2019-08-03 15:17:53 · 19086 阅读 · 0 评论 -
通过 SQL 的 group by 获取两条或以上数据
现有充值数据,如:id money time 12345 100.00 19-07-20 13245 110.00 19-07-21 12345 120.00 19-07-22 12345 130.00 19-07-23 56789 100.00 19-07-21 如何找出每个id下首次充值的前两笔...原创 2019-07-20 14:15:05 · 3575 阅读 · 0 评论 -
SQL 中 find_in_set 的使用
应用场景:如数据库某个字段 type 保存的是某个商品的类型,如“1,2,3”类似的逗号间隔的字符串需求:找到type中类型为k的商品desc table set_test;| Field | Type | Null | Key | Default | Extra |+-------+---------+------+-----+---------+--...原创 2019-06-27 14:52:47 · 923 阅读 · 0 评论 -
Sql 导出 Excel 整数数据精度丢失处理
主要的问题在于Excel最大整数表示的问题,Excel最大整数支持15位,超过尾数将被置为0假设现在id字段为大整型,约25位,则通过sql处理为:select *, concat("\t", id) as id from test;再通过数据库的搜索结果导出到excel即可。...原创 2019-07-08 14:14:08 · 3503 阅读 · 0 评论 -
什么是事务及其特性
事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。事务特性:(1)原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。(2)一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态(3)隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,(4) 持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故...原创 2019-02-19 10:01:27 · 1510 阅读 · 0 评论 -
Nginx Lua 开发 - MySQL 操作
在 Nginx 中,MySQL 有两种访问方式1)使用 ngx_lua 模块与 lua-resty-mysql 模块,在安装 Openresty 时默认安装的2)使用 drizzle_nginx_module (HttpDrizzleModule) 模块:需要单独安装。一、lua-resty-mysql 访问1)简单在MySQL中创建一些测试数据2)案例,在 nginx.con...原创 2019-03-28 19:47:02 · 1608 阅读 · 0 评论 -
MySQL 提高 limit 查询速度
一、limit 范围查询140万条数据进行测试select * from lbcode order by codeid desc limit 0,10; -- 0.001msselect * from lbcode order by codeid desc limit 10000,10; -- 0.016msselect * from lbc...原创 2019-04-20 17:41:14 · 1480 阅读 · 0 评论 -
深入浅出 MySQL:SQL 优化 - 优化 SQL 一般步骤
SQL 优化测试数据:http://downloads.mysql.com/docs/sakila-db.zip一、通过 show status 了解 SQL 的执行频率show global status like 'com_%'; -- 数据库上次启动至今的状态信息show session status like 'com_%'; ...原创 2019-04-13 16:25:04 · 238 阅读 · 2 评论 -
深入浅出 MySQL:优化数据库对象
一、优化表的数据类型select * from payment PROCEDURE ANALYSE()\G;-- 会根据表的值给出优化建议,Optimal_fieldtype二、使用中间表提高统计查询速度-- 假设现在需要统计指定条件的记录select sum(customer_count) from session where customer_date > add...原创 2019-04-21 15:32:31 · 162 阅读 · 0 评论 -
深入浅出 MySQL:SQL 优化 - 索引问题
一、索引的存储分类MySQL 提供4种索引:B-Tree(大部分引擎都支持)、Hash(Memory)、R-Tree(MyISAM,空间索引)、Full-text(MyISAM,全文索引)其中:Hash索引只能在Memory引擎中,且where条件为=时才会生效二、MySQL如何使用索引B-Tree 索引:平衡二叉树结构,可以进行全关键字、关键字范围、关键字前缀查询。M...原创 2019-04-14 17:21:11 · 208 阅读 · 0 评论 -
深入浅出 MySQL:SQL 优化 - 两个简单实用的优化方法
一、定期分析表和检查表分析表:修复索引analyze table xxx; -- 只对MyISAM Innodb BDB有效-- 修复索引,某些时候当某列索引范围小于该列实际范围值时,索引可能会失效。-- 搭配使用show index from xxx; -- 查看当前表的索引情况,cardinality (索引对应的列的散列程度)analyze table ...原创 2019-04-14 17:56:52 · 268 阅读 · 0 评论 -
深入浅出 MySQL:应用优化
一、使用连接池访问数据库,建立连接是较为昂贵的,建立连接池可以提高数据库的性能。二、减少对MySQL的访问1)避免对同一数据重复检索2)使用查询缓存show variables like '%query_cache%';-- have_query_cache : 是否配置缓存query_cache_size : 缓存缓冲区大小,单位MBquery_cache_...原创 2019-04-15 10:34:22 · 181 阅读 · 0 评论 -
深入浅出 MySQL:SQL 优化 - 常用的 SQL 优化
一、大批量插入数据MyISAM 表的插入优化,插入前先关闭索引更新。alter table xxx DISABLE KEYS; -- 关闭索引更新... -- 插入数据alter table xxx ENABLE KEYS;InnoDB 表的插入优化:1)导入的数据按主键排列,效率更高。因为 Innodb 数据是按主键顺序排...原创 2019-04-15 14:29:34 · 328 阅读 · 0 评论 -
MySQL 存储时间字段 datetime 与 timestamp 比较
1)timestamp:4个字节,(北京时间:2038年1月19日中午11:14:07)之后无法正常工作2)datetime:8个字节当涉及到日期计算、应用需要跨多个时区(国际业务)等,使用时间戳。timestamp 在不同时区下能确保时间的精确性。总体来说,存储时间优先使用时间戳较好。...原创 2019-04-25 10:33:29 · 1282 阅读 · 0 评论 -
取代 SQL 中的 Order By Rand() 提高效率
一、使用 ORDER BY RAND() 效率低下在300万数据下:select * from lottery order by rand() limit 1; -- 耗时:50.684msselect * from lottery where id = 582211; -- 耗时:0.001ms二、通过程序生成随机i...原创 2019-06-13 17:49:38 · 3228 阅读 · 0 评论 -
mysql 主从配置
一、replication 原理1)主服务器凡运行insert/update等语句,都会产生一个二进制日志 binlog2)从服务器不断读取主服务器的binlog3)从主服务器读取到的binlog转换为自身可执行的relaylog4)从服务器执行relaylog二、配置主服务器192.168.0.100 (主服务器,负责写操作)vim /etc/my.cnf增加 se...原创 2019-02-08 23:18:01 · 1534 阅读 · 1 评论