mysql那些招

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

show table status

mysql官方文档在

http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html

这里的rows行是表的行数,但是实际上是不准的。myisam是准的,其他的存储引擎是不准的。要准确的行数就需要使用count(*) 来获取了。

mysql执行大批量删除

执行大批量删除的时候注意要使用上limit

因为如果不用limit,删除大量数据很有可能造成死锁

如果delete的where语句不在索引上,可以先找主键,然后根据主键删除数据库

ps: 平时update和delete的时候最好也加上limit 1 来防止误操作

optimize、Analyze、check、repair维护操作

l optimize 数据在插入,更新,删除的时候难免一些数据迁移,分页,之后就出现一些碎片,久而久之碎片积累起来影响性能,这就需要DBA定期的优化数据库减少碎片,这就通过optimize命令。

如对MyisAM表操作:optimize table 表名

对于InnoDB表是不支持optimize操作,否则提示“Table does not support optimize, doing recreate + analyze instead”,当然也可以通过命令:alter table one type=innodb; 来替代。

l Analyze 用来分析和存储表的关键字的分布,使得系统获得准确的统计信息,影响 SQL 的执行计划的生成。对于数据基本没有发生变化的表,是不需要经常进行表分析的。但是如果表的数据量变化很明显,用户感觉实际的执行计划和预期的执行计划不 同的时候,执行一次表分析可能有助于产生预期的执行计划。

Analyze table 表名

l Check检查表或者视图是否存在错误,对 MyISAM 和 InnoDB 存储引擎的表有作用。对于 MyISAM 存储引擎的表进行表检查,也会同时更新关键字统计数据

l Repair optimize需要有足够的硬盘空间,否则可能会破坏表,导致不能操作,那就要用上repair,注意INNODB不支持repair操作

生成乱序的id

方法:

使用预设表

比如id和toid的映射

其中id是固定的,toid是随机的。

然后在redis或memcache中记录一个指针值,指向id

当要获取一个新toid的时候,取出指针值,加1,然后去预设表中获取toid

查询和索引

查询的时候必须要考虑到如何命中索引

比如有几个小招:

1 不要在索引列中使用表达式

where mycol *2 < 4

2 不要在like模式的开始位置使用通配符%

where col_name like ‘%string%’

不如

where col_name like ‘string%’

3 避免过多使用mysql自动转换类型,有可能无法用到index

比如

select * from mytbl where str_col=4

但是str_col为字符串,这里其实就隐含了字符串变化

应该使用

select * from mytbl where str_col=’4’

索引比表还大就不需要建立索引了吗

索引是按照顺序排列的。所以即使索引比表大,也是可以加快查询速度的。

当然如果索引比表还大首要的任务必须是检查下索引建立地是否有问题

Char和varchar如何选择

char是定长,varchar变长 
varchar除了设置了数据之外,还多使用1两个字节定义了数据实际长度。

char会在后面空余的行填充上空字符串

myisam建议使用char。myisam中有个静态表的概念。使用char比使用varchar的查询效率高很多。

innodb建议使用varchar。主要是从节省空间的方面考虑

多个TimeStamp设置默认值

一个表中至多只能有一个字段设置CURRENT_TIMESTAMP

对于下面的需求:

一个表中,有两个字段,createtime和updatetime。

1 当insert的时候,sql两个字段都不设置,会设置为当前的时间

2 当update的时候,sql中两个字段都不设置,updatetime会变更为当前的时间

这样的需求是做不到的。因为你无法避免在两个字段上设置CURRENT_TIMESTAMP

 

解决办法有几个:

1 使用触发器。

2 将第一个timestamp的default设置为0

3 老老实实在sql语句中使用时间戳。

http://www.cnblogs.com/yjf512/archive/2012/11/02/2751058.html

查询数据表有多少行,多少容量

不要使用select count(*)

使用show table status like ‘table_name’  但是innodb的话会有50%左右的浮动,是个预估值

AUTO_INCREMENT的设置

1 不要设置为int,请设置为unsinged int,auto_increment的范围是根据类型来判定的

2 auto_increment数据列必须要有索引,并且保证唯一性。

3 auto_increment必须有NOT NULL属性

4 auto_increment可以使用

UPDATE table SET seq = LAST_INSERT_ID(seq -1)

mysql的表示时间的字段用什么类型

表示时间可以使用timestamp和datetime来使用

datetime表示的时间可以从0000-00-00:00:00 到9999-12-31:00:00:00

timestamp表示的时间为1970-01-01 08:00:01到2038-01-19 11:14:07

timestamp占用的空间比datetime少,且可以设置时区等功能,所以能使用timestamp的地方尽量使用timestamp

使用timestamp还可以设置

[ON UPDATE CURRENT_TIMESTAMP]

[DEFAULT CURRENT_TIMESTAMP]

myisam和innodb支持外键

myisam不支持外键,innodb支持;

如果你使用创建外键的命令对myisam的表操作,操作不会返回失败,但是是没有外键关联建立起来的。

对一个字段加减语句

经常有需求对一个字段加减会使用

update table set a = a+1

这样是对的

但是如果这样设置:

select a from table

取出数据后a为1

update table set a =2

这样会导致如果在select和update之间有其他事务操作修改这个字段的话,导致最后的设置可能出错。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
SQL 关系型数据库 MySQL
MySQL初级篇(四)
MySQL初级篇(四)
|
4月前
|
存储 JavaScript 前端开发
【MySQL】MySQL9.0发布,有点小失望
本文介绍了MySQL 9.0新版本的更新情况及其主要特性,包括JavaScript存储过程、VECTOR类型支持、内联和隐式外键约束等。作者详细讲解了如何在官网上查找新特性,并提供了两种下载方法:官网下载和Docker镜像。此外,文章还探讨了老版本是否需要升级至MySQL 9.0的问题,最终认为新特性并不足以成为升级的必要理由。适合对MySQL新版本感兴趣的读者参考。
342 1
【MySQL】MySQL9.0发布,有点小失望
|
7月前
|
存储 关系型数据库 MySQL
MySQL第五战:常见面试题(下)
MySQL第五战:常见面试题(下)
|
存储 NoSQL 关系型数据库
MySQL初级篇(一)
MySQL初级篇(一)
|
关系型数据库 MySQL 索引
MySQL初级篇(二)
MySQL初级篇(二)
|
关系型数据库 MySQL
MySQL初级篇(三)
MySQL初级篇(三)
|
SQL 存储 安全
带你走进MySQL
带你走进MySQL
65 0
|
SQL 存储 Oracle
MySQL初印象
MySQL简介
142 0
MySQL初印象
|
SQL 存储 Oracle
MySQL必知必会(初级篇)
MySQL必知必会(初级篇)
128 0
MySQL必知必会(初级篇)
|
存储 SQL 关系型数据库
mysql-黑马-day01
mysql-黑马-day01
mysql-黑马-day01