MySql一些有用的知识点
摘要
-
本文基于
mysql-8.0.30
,https://dev.mysql.com/doc/refman/8.0/en/
常用操作
1 | mysql> show databases; 显示所有数据库 |
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 | 如果整形数据没有负数,如ID号,建议指定为UNSIGNED无符号类型,容量可以扩大一倍。 |
-
日期和时间
类型 | 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 | TIME 类型的取值范围为 -838:59:59~838:59:59,小时部分如此大的原因是TIME类型不仅可以用于表示一天的时间,还可能是某个事件过去的时间或两个事件之间的时间间隔(可大于 24 小时,或者甚至为负)。 |
-
字符串–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 | 字符串的长度相差较大用VARCHAR;字符串短,且所有值都接近一个长度用CHAR。 |
命令行执行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 | # 更新和删除都没有输出结果的 |
执行一个sql文件
1 | # 可以将多条sql语句写入一个sql文件,比如初始化建表脚本等,可以按sql语句的顺序一条一条的执行 |
MyISAM Key Buffer
-
key_buffer_size
规定了系统将多少内存用作MyISAM的索引缓存
1 | # 查看key buffer设置大小 |
-
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有地方待。