前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL常用技巧

MySQL常用技巧

作者头像
jiewuyou
发布2022-09-29 15:45:39
3740
发布2022-09-29 15:45:39
举报
文章被收录于专栏:数据人生

建表

  1. 每个表都有一个id字段,最好为UNSIGNED,如 INT(9) UNSIGNED NOT NULL
  2. 在表使用一段时间后,使用PROCEDURE ANALYSE得到建议,如select * from log_table where record_date > “2015-06-01” PROCEDURE ANALYSE (100,1000);
  3. 尽量使用NOT NULL的字段,因为NULL也是占空间的
  4. 将IP存成UNSIGNED INT,SQL中用INET_ATON() 将IP地址转换成整型,使用INET_NTOA()将其还原
  5. 使用固定长度的字段可以节省空间
  6. 字段长度尽可能短,以便优化速度。但是要保证每个字段有足够的空间以满足需求
  7. 字符串字段:因为mysql默认不区分大小写,如果字符串字段作为主键的话,需要将其改成bin类型,如
代码语言:javascript
复制
CREATE TABLE T( 
    A VARCHAR(10) BINARY 
); 
  1. 索引:将经常查询的字段创建成一个索引字段
  2. 索引:如果一个字段在key中,尽量将其转换成整数,以加快查询速度。比如我们经常查询各个机型的日活,就可以将机型映射成整数存在DB中,以加快查询速度

查询

  1. 想看自己写的查询语句是否充分利用了数据库的索引,可以使用EXPLAIN,用法EXPLAIN querySQL
  2. 使用查询缓存,不要使用 NOW() 、 RAND() 等
  3. 如果只需要一条数据的话,使用LIMIT 1
  4. 对搜索的字段建立索引
  5. JOIN时,对连接字段使用相同的数据类型,并对字段建立索引
  6. 不要使用ORDER BY RAND(),因为查询前,该查询会对表中每一行记录都执行RAND()
  7. 查询时尽量指定查询字段,避免使用SELECT *,以提高IO速度

使用

  1. 含有大量数据的DELETE或者INSERT时,使用分片,如DELETE FROM logs WHERE log_date <= ‘2009-10-01’ LIMIT 10000

导出到测试环境

大公司常有生产环境和测试环境,测试环境没法实时同步生产环境的数据,这就需要我们手工进行同步了。

备份到文件

我们不需要将生产环境的数据全量导出到测试环境,只需要满足部分条件的数据,如最近1个星期的数据,或者最近的100条数据

代码语言:javascript
复制
mysqldump -u用户名 -p密码 -h生产环境节点 数据库 数据表 --where "查询语句" --skip-lock-tables  --default-character-set=utf8 --no-create-info --quick > 数据表.sql
导入到测试环境
代码语言:javascript
复制
mysql -u测试用户 -p测试密码 -h测试节点 数据库名 < Page_Stats.sql

更新

存在则更新,不存在则插入

我们需要定期更新离线数据库,更新时,可能有重复的数据,即已经存在满足唯一性索引的数据。这个时候,如果直接删除数据库中的数据,可能引出一些BUG。mysql中有一种插入数据库的写法,如果数据不存在则插入数据,如果存在满足唯一性索引的数据,则更新相应数据

代码语言:javascript
复制
INSERT INTO table (column_1, column_2, column_3) VALUES ('column_1_value', 'column_1_value', 'column_3_value') ON DUPLICATE KEY UPDATE column_1='column_1_value', column_2='column_2_value', column_3='column_3_value';
主键存在则将某个字段的数值增加,不存在则插入
代码语言:javascript
复制
INSERT INTO T(app_id, count) VALUES(10086, 10) ON DUPLICATE KEY UPDATE count = 10 + count"

维护数据

对于有时效性的数据,可以定期清除n天前的数据。

存储优化

假如线上数据库只记录了每个广告主最新的出价信息,而我们想观察每个广告主的历史出价信息。那么每分钟记录所有广告主的出价信息的话,数据量将会非常大,这个时候,我们就需要对存储进行优化:如果该广告主出价信息没有变化,我们就不需要记录了

数据库表

表:coupon_bid_realtime 字段:coupon bid record_time 唯一索引:coupon record_time

查询所有广告主的最近出价信息
代码语言:javascript
复制
SELECT A.coupon, A.bid, A.record_time FROM coupon_bid_realtime AS A JOIN (SELECT coupon, MAX(record_time) AS record_time FROM coupon_bid_realtime GROUP BY coupon) AS B ON A.coupon = B.coupon AND A.record_time = B.record_time;
过滤没有变化的数据

根据前面查询出来的广告主的出价信息,如果广告主没有变更出价信息,则不插入

参考

  1. Top 20+ MySQL Best Practices
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-08-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 建表
  • 查询
  • 使用
  • 导出到测试环境
    • 备份到文件
      • 导入到测试环境
      • 更新
        • 存在则更新,不存在则插入
          • 主键存在则将某个字段的数值增加,不存在则插入
          • 维护数据
          • 存储优化
            • 数据库表
              • 查询所有广告主的最近出价信息
                • 过滤没有变化的数据
                • 参考
                相关产品与服务
                云数据库 SQL Server
                腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档