MySql一些有用的知识点

摘要

常用操作

1
2
3
4
5
6
7
8
9
mysql> show databases; 显示所有数据库
mysql> use dbname; 打开dbname数据库
mysql> show tables; 显示数据库dbname中所有的表;
mysql> describe tablename; 显示表mysql数据库中tablename表的列信息,也可以简写为 desc tablename;
mysql> desc tablename; 同上
mysql> select version(); 查看数据库版本号
mysql> select database(); 查看当前选中的数据库
mysql> select now(); 查看数据库当前时间
mysql> select user(); 查看当前登录用户

mysql中的数据类型对应java实体数据类型

  • 数值类型

类型 java类型 大小 范围(有符号) 范围(无符号) 用途 备注
TINYINT Boolean/int/Integer 1 字节 (-128, 127) (0, 255) 小整数值
SMALLINT int/Integer 2 字节 (-32768, 32767) (0, 65535) 大整数值
MEDIUMINT int/Integer 3 字节 (-8388608, 8388607) (0, 16777215) 大整数值
INT或 INTEGER int/Integer/Long 4 字节 (-2147483648, 2147483647) (0, 4294967295) 大整数值
BIGINT int/Integer/Long/BigInteger 8 字节 (-9233372036854775808, 9223372036854775807) (0, 18446744073709551615) 极大整数值 BigInteger最大值没有限制,内部是int[]数组,缺点是速度慢
FLOAT float/Float 4 字节 (-3.402823466E+38, -1.175494351E-38),0,(1.175494351E-38,3.402823466351E+38) 0, (1.175494351E-38, 3.402823466E+38) 单精度 浮点数值
DOUBLE double/Double 8 字节 (-1.7976931348623157E+308, -2.2250738585072014E-308), 0, (2.2250738585072014E-308, 1.7976931348623157E+308) 0, (2.2250738585072014E-308, 1.7976931348623157E+308) 双精度 浮点数值
DECIMAL BigDecimal 对DECIMAL(M,D)如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 高精度小数值 用于货币计算等高精度场景

优化建议

1
2
3
4
5
6
如果整形数据没有负数,如ID号,建议指定为UNSIGNED无符号类型,容量可以扩大一倍。
建议使用TINYINT代替ENUM、BITENUM、SET。
避免使用整数的显示宽度,也就是说,不要用INT(10)类似的方法指定字段显示宽度,直接用INT。
DECIMAL最适合保存准确度要求高,而且用于计算的数据,比如价格。但是在使用DECIMAL类型的时候,注意长度设置。
建议使用整形类型来运算和存储实数,方法是,实数乘以相应的倍数后再操作。
整数通常是最佳的数据类型,因为它速度快,并且能使用AUTO_INCREMENT。
  • 日期和时间

类型 java类型 大小 范围(有符号) 范围(无符号) 用途 备注
DATE Date/LocalDate 3 1000-01-01 到 9999-12-31 YYYY-MM-DD 日期值
TIME Date/LocalDateTime 3 ‘-838:59:59’ 到 ‘838:59:59’ HH:MM:SS 时间值或持续时间
YEAR Date 1 1901 到 2155 YYYY 年份值
DATETIME Date/LocalDateTime 8 1000-01-01 00:00:00 到 9999-12-31 23:59:59 YYYY-MM-DD HH:MM:SS 混合日期和时间值
TIMESTAMP Date/LocalDateTime 4 1970-01-01 00:00:00 到 2038-01-19 03:14:07 YYYYMMDDhhmmss 混合日期和时间值,时间戳

优化建议

1
2
3
4
5
6
7
8
9
TIME 类型的取值范围为 -838:59:59~838:59:59,小时部分如此大的原因是TIME类型不仅可以用于表示一天的时间,还可能是某个事件过去的时间或两个事件之间的时间间隔(可大于 24 小时,或者甚至为负)。
MySQL能存储的最小时间粒度为秒。
建议用DATE数据类型来保存日期。MySQL中默认的日期格式是yyyy-mm-dd。
用MySQL的内建类型DATE、TIME、DATETIME来存储时间,而不是使用字符串。
当数据格式为TIMESTAMP和DATETIME时,可以用CURRENT_TIMESTAMP作为默认(MySQL5.6以后), MySQL会自动返回记录插入的确切时间。
TIMESTAMP是UTC时间戳,与时区相关。
DATETIME的存储格式是一个YYYYMMDD HH:MM:SS的整数,与时区无关,你存了什么,读出来就是什么。
除非有特殊需求,一般的公司建议使用TIMESTAMP,它比DATETIME更节约空间,但是像阿里这样的公司一般 会用DATETIME,因为不用考虑TIMESTAMP将来的时间上限问题。
有时人们把Unix的时间戳保存为整数值,但是这通常没有任何好处,这种格式处理起来不太方便,我们并不推荐 它。
  • 字符串–String

类型 java类型 大小 用途
CHAR String 0-255字节 定长字符串,char(n)当插入的字符串实际长度不足n时, 插入空格进行补充保存。在进行检索时,尾部的空格会被 去掉。
VARCHAR String 0-65535字节 变长字符串,varchar(n)中的n代表最大列长度,插入的字符串实际长度不足n时不会补充空格
TINYBLOB byte[] 0-255字节 不超过 255 个字符的二进制字符串
TINYTEXT String 0-255字节 短文本字符串
BLOB byte[] 0-65535字节 二进制形式的长文本数据
TEXT String 0-65535字节 长文本数据
MEDIUMBLOB byte[] 0-16777215字节 二进制形式的中等长度文本数据
MEDIUMTEXT String 0-16777215字节 中等长度文本数据
LONGBLOB byte[] 0-4294967295字节 二进制形式的极大文本数据
LONGTEXT String 0-4294967295字节 极大文本数据

优化建议

1
2
3
4
5
6
7
8
字符串的长度相差较大用VARCHAR;字符串短,且所有值都接近一个长度用CHAR。
CHAR和VARCHAR适用于包括人名、邮政编码、电话号码和不超过255个字符长度的任意字母数字组合。
varchar 和 text 都可以存储变长字符串且字符串长度上限为65535字节,但是text不能设置默认值,且存储和查询速度慢、仅支持前缀索引。
当varchar大于某些数值的时候,其会自动转换为text,大于varchar(255)变为 tinytext,大于varchar(500)变为 text,大于varchar(20000)变为 mediumtext。
那些要用来计算的数字不要用VARCHAR类型保存,因为可能会导致一些与计算相关的问题。换句话说,可能影响到计算的准确性和完整性。
尽量少用BLOB和TEXT,如果实在要用可以考虑将BLOB和TEXT字段单独存一张表,用id关联。
BLOB系列存储二进制字符串,与字符集无关。TEXT系列存储非二进制字符串,与字符集相关。
BLOB和TEXT都不能有默认值。

命令行执行sql语句

执行单条sql语句 : -e

  • 查询结果保存到文件

1
mysql -uroot -p -DdbName -e "SELECT t.chapter_num as num, t.title as title FROM chapter_info t where t.book_id = 10  order by t.chapter_num asc" > result.txt
  • 执行更新或删除语句

1
2
3
# 更新和删除都没有输出结果的
mysql -uroot -p -DdbName -e "update chapter_info set title='new title' where book_id = 10"
mysql -uroot -p -DdbName -e "delete from chapter_info where book_id = 10"

执行一个sql文件

1
2
# 可以将多条sql语句写入一个sql文件,比如初始化建表脚本等,可以按sql语句的顺序一条一条的执行
mysql -uroot -p -DdbName < init.sql

MyISAM Key Buffer

  • MyISAM存储引擎

  • key_buffer_size规定了系统将多少内存用作MyISAM的索引缓存

1
2
# 查看key buffer设置大小
mysql> show variables like 'key_buffer_size';
  • MyISAM增删改查都是直接操作这个Key Buffer

  • Key Buffer只存放索引,对于数据是读取数据文件

  • 如果一个读请求到达,能从Key Buffer中找到数据,那么就不再访问myi文件,直接根据data域去找对应的数据

  • 如果在Key Buffer中找不到,则读取myi中的对应File Block放入Key Buffer的LRU链的头部,并从Key Buffer返回数据

  • 当我们从“.MYI〞文件中读入File Block到Key Buffer中的Cache Block时候,如果整个Key Buffer中己经没有空闲的Cache Block可以使用的话,将会通过Mysql实现的LRU相关算法将某些Cache Blocl清除出夫,让新进来的File Block有地方待。