mysql那些招
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一招入门
连接mysql数据库命令:mysql -u root -p 创建mysql数据库:create databaase xx库; 创建mysql表: create table db_xx表( id int ...
- cmd连接mysql的方法详解(转载)
连接:mysql -h主机地址 -u用户名 -p用户密码 (注:u与root可以不用加空格,其它也一样)断开:exit (回车) 创建授权:grant select on 数据库.* to 用户名@登 ...
- MYSQL的常用命令和增删改查语句和数据类型
连接命令:<a href="http://lib.csdn.net/base/mysql" class='replace_word' title="MySQL知识库 ...
- MYSQL的常用命令和增删改查语句和数据类型【转】
连接命令:<a href="http://lib.csdn.net/base/mysql" class='replace_word' title="MySQL知识库 ...
- 笔记--MySQL相关操作
一 登录数据库 1 用户无密码: mysql -uroot -p mysql-> 2 用户有密码: MySQL -root -p[passwd] mysql-> 二 创建数据库: 查询 ...
- mysql服务器配置
mysql的配置文件 /etc/mysql/my.cnf 发现如下配置 # Instead of skip-networking the default is now to listen only ...
- DOS命令行下mysql 基本命令
第一招.mysql服务的启动和停止 net stop mysql net start mysql 第二招.登陆mysql 语法如下: mysql -u用户名 -p用户密码 键入命令mysql -uro ...
- Mysql常用命令行大全
第一招.mysql服务的启动和停止 net stop mysql net start mysql 第二招.登陆mysql 语法如下: mysql -u用户名 -p用户密码 键入命令mysql -uro ...
- Mysql常用命令行大全——转载
转载地址:http://www.blogjava.net/supperchen/archive/2012/10/11/389340.html 第一招.mysql服务的启动和停止 net stop my ...
随机推荐
- accessToken的使用
1.accessToken是啥,干嘛用? 形象解释:申请调兵-->皇帝同意-->兵符-->开始调兵 拿到用户在第三方平台的唯一的标识; 获取用户的nickname,头像,邮箱等其他信 ...
- Git学习系列之Git基本操作克隆项目(图文详解)
不多说,直接上干货! 想必,能进来看我写的这篇博文的朋友,肯定是了解过. 比如SVN的操作吧,最常见的是 检出(Check out ...), 更新 (Update ...), 以及 提交(Commi ...
- ruby gems列表
https://github.com/shageman/cobradeps
- 群晖MyDS账号注册--实现使用QuickConnect外网访问
最近公司拿了个NAS给我,让我把它配置好,之前没有接触过这个东西,上网一查,发现就是和去年很火的玩客云和斐讯天天链N1的功能一样,可以实现文件储存和文件共享. 设备型号:群晖DS214SE 系统版本: ...
- 【LeetCode题解】350_两个数组的交集Ⅱ
目录 [LeetCode题解]350_两个数组的交集Ⅱ 描述 方法一:映射 Java 实现 Python 实现 类似的 Python 实现 方法二:双指针 Java 实现 Python 实现 [Lee ...
- ASP.NET 表单验证方法与客户端(浏览器)服务器交互机制的故事
想到这个问题完全是一个意外吧,是在寻找另外一个问题答案的过程中,才对验证方法与浏览器服务器交互机制的关系有了清晰的认识. 先说下验证方法,验证方法分为前台验证和后台验证. 前台验证就是类似jQuery ...
- vim 编辑器常规操作
所看视频教程:兄弟连Linux云计算视频教程5.1文本编辑器Vim-5.2 插入命令 a:在光标所在字符后插入; A:在光标所在行尾插入; i:在光标所在字符前插入; I:在光标所在字符行行首插入; ...
- [LeetCode]Delete and Earn题解(动态规划)
Delete and Earn Given an array nums of integers, you can perform operations on the array. In each op ...
- 5.Resource注解解析
Resource有两种使用场景 1.Resource 当Resource后面没带参数的时候是根据它所注释的属性名称到applicationContext.xml文件中查找是否有bean的id与之匹配, ...
- [POI2007]EGZ-Driving Exam
能到达所有路的充要条件是能到达左右两端的路 用vector反向建边对每条路左右分别求个最长不上升子序列 预处理出每条路向左向右分别需要多建多少路才能到达最左端和最右端 然后跑个\(\Theta(n)\ ...