MySQL

分类下相关文章

MySQL 通过经纬度查询附近的目标

之前一直使用 Redis 的 GeoHash 来查询附近的目标,但是为了架构的简化,我决定尝试一下 MySQL 来进行查询。 SELECT name, latitude, longitude, SQRT( POW(69.1 * (latitude - [target_lat]), 2) + POW(69.1 * ([target_lng] - longitude) * COS(latitude / 57.3), 2)) AS distance FROM TableName HAVING distance < [distance] ORDER BY distance; ...

阅读全文...

MySQL 8 引入索引 VISIBLE 与 INVISIBLE 的实战意义

实际使用场景: 线上服务的数据库中某个字段已经创建了索引,但是后续运营过程中,发现这个索引并没有实际用途,反而影响了写入速度。那么,我们就会想去掉这个字段的索引。可是,在数据量非常大的情况下,新建索引,删除索引都是一件非常耗时的操作。所以,删除索引的操作,马虎不得。一旦发现这个索引还有其他业务用到,再重新建索引,耗时的创建过程会严重影响线上业务。 这时,index 的 visible 和 invisible 就非常实用了。可以先将该索引设置为 invisible,这样优化器就会忽略这个索引,但是索引依然存在于引擎内部。而设置 invisible 和 visible 操作的耗时又非常少,对业务基 ...

阅读全文...

MySQL 8.0 的文档型数据存储 - Document Store

本质上就是实现了一套 MongoDB,然而我对 MongoDB 并不感冒。。。 什么是文档 Document A Document is a set of key and value pairs, as represented by a JSON object. 文档是一堆键值对的集合,表现为 JSON 结构。 例如: { "domain": "www.sunzhongwei.com", "title": "大象笔记" } collection 感觉类似 mongodb 里 collection 的概念, ...

阅读全文...

MySQL 全文检索方案 - FULLTEXT 索引

尽量不要使用 Like 由于 MySQL LIKE '%text%' 是无法使用索引的,Like 能用上索引的唯一可能 LIKE 'text%' 所以实际使用中 LIKE 毫无实用价值。。。 mysql 5.7.6 之后支持了中日韩文的全文检索 查看了本机的 mysql 版本 mysqld --version mysqld Ver 5.7.18-0ubuntu0.16.10.1 for Linux on x86_64 ((Ubuntu)) A full-text index in MySQL is an index of type FULLTEXT. 实际上,就是增加了一个新的索 ...

阅读全文...

Ubuntu 18.04 安装 mysql 8.0

卸载之前安装的 mysql 5.7 sudo apt-get autoremove --purge mysql-server sudo apt-get remove mysql-server sudo apt-get autoremove mysql-server sudo apt-get remove mysql-common 安装 mysql 8.0 首先需要去 mysql 官网 https://dev.mysql.com/downloads/repo/apt/ 下载一个 Ubuntu / Debian (Architecture Independent), DEB Pack ...

阅读全文...

ubuntu 18.04 为 mysql 设置 root 初始密码

ubuntu 18.04 上安装 mysql 5.7 之后,默认没有设置 root 密码,印象中之前是有一个引导界面的,现在似乎去掉了。 设置 mysql 初始密码需要使用命令 sudo mysql_secure_installation 按照提示,一步步操作即可 root 连接需要 sudo 很奇葩,ubuntu 18.04 上 mysql -uroot -p ERROR 1698 (28000): Access denied for user 'root'@'localhost' 永远会报这个错误。 解决方法就是加上 sudo... sudo mysql -uroot -p 带来的问 ...

阅读全文...

通过 mysql select 结果导出到 txt 文本批量提交历史内容到熊掌号

周六花了一个小时支持了 MIP 网页,今天再接再厉将历史内容全部提交到熊掌号。 首先将数据库中的所有笔记的链接导出: SELECT CONCAT("https://www.sunzhongwei.com/mip/", slug) FROM articles order by id desc INTO OUTFILE '/tmp/urls.txt' 但是报错 ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this ...

阅读全文...

MySQL 中使用条件语句输出查询结果

例如,我想把数据表中的数据导出成可读的结果。 select `pay_status`, if(pay_status = 0, '未支付', '已支付') as pay_status from order 0 未支付 0 未支付 1 已支付 ...

阅读全文...

使用 MySQL 存储 schema-less 数据的探索

table design: 表结构做成 id, key, value 还是 key, value 比较好。 按照 Bret Taylor 的分享,比较好的设计是 added_id -> INT NOT NULL AUTO_INCREMENT PRIMARY KEY id -> UNIQUE KEY updated -> KEY body -> json 之所以加上自增的 added_id, 是因为 Mysql InnoDB 是按照主键顺序在磁盘上顺序存储 数据的。这样就能保证新数据总是能写在旧数据的后面,因为新数据读取的频率总会高于 旧数据,磁头不会波动太大。 e. ...

阅读全文...

使用 crontab & mysqldump 对 MySQL 数据库进行自动定时备份

crontab 配置 crontab 中添加 30 4 * * * /usr/bin/mysqldump -uuser db > /path/to/backups/db-`date +"\%Y_\%m_\%d_\%H"`.sql 即每天凌晨 4 点半进行自动备份 注意,这里不要加 -p 参数。 如何自动输入密码 不安全的方式是 直接在 crontab mysqldump 命令的参数中用 -p 指定密码,但是这样做有巨大的风险。 因为,任何用户都可以通过 ps axuw | grep mysqldump 看到进程的命令参数。 一种安全的方式是 在用户的根目录添加配置文 ...

阅读全文...

MySQL 替换 text 字段中的指定字符串

昨天将博客启用了 HTTPS,发现一个包含 js 的 markdown 文章显示异常。 vuejs 中如何优雅的获取 Input 值 导致异常的原因是,https 页面引用了 http 的 js 文件,即 vuejs 的 cdn 链接使用了 http 的。 解决方法就是直接在 mysql 中进行替换 UPDATE articles SET content = REPLACE(content, "http", "https") where slug = 'how-to-get-input-value-in-vuejs'; 如果需要批量替换数据表中的 h ...

阅读全文...

MySQL 保存 emoji 表情失败报错

有朋友在博客评论里反馈,无法提交带 emoji 表情的评论。第一反应是数据库编码问题。 由于一直不习惯使用 emoji,所以这个问题一直没发现。 Laravel 的报错信息 production.ERROR: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8mb4_unicode_ci,COERCIBLE) for operation '=' MySQL CHARSET 与 COLLATE 的区别 https://stackoverflow. ...

阅读全文...

MySQL 导出指定数据表中的一行记录

场景 开发环境的一行配置(存于数据库中),我想导出到线上配置。 使用 Laravel Seeds 会导致全表被覆盖,所以只需要在线上插入一行。 两种方案: MySQl Workbench SELECT * FROM settings where id=10; 点击查询结果栏的按钮 “Export recordset to an external file“ 文件格式选择 SQL INSERT statements 即可。 复制到线上 MySQL 命令行执行即可。 MySQL 命令行 mysqldump -uxxx -p databasename tablename --where &quot ...

阅读全文...

mysql 字段并不是越大越好,这不 php 内存爆掉了

为了一时之快,将存储商品描述的字段由 text 变更成了 longtext。 结果,由于升级 summernote 版本,导致图片上传 cdn 的回调函数失效,新上传图片都被转换成了 base64 存储与描述字段中。每个商品至少有 10 张这种图片,一张图片大概1兆左右。原本如果使用 text 是可以规避这个问题的,因为 text 存储的内容大概为 65k,而 longtext 存储上限大概为 4G,所以默认的 php 内存上限被轻松超过。 2017/10/28 18:12:09 [error] 26887#26887: *839609 FastCGI sent in stderr: &qu ...

阅读全文...

summernote 编辑器保存的内容超出了 MySQL TEXT 的长度限制

昨晚收到一堆微信小程序后台的报警邮件。但是邮件内容看不到,登录服务器查看 laravel 日志,发现是 summernote 保存的商品描述过长,超出了 TEXT 的长度限制 String data, rig ht truncated: 1406 Data too long for column 'description' at row 1 at vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php:107, PDOException(code: 22001): SQLSTATE[22001]: String data, ...

阅读全文...