加入收藏 | 设为首页 | 会员中心 | 我要投稿 92站长网 (https://www.92zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

mysql中表的知识点总结

发布时间:2022-01-19 13:25:40 所属栏目:MySql教程 来源:互联网
导读:这篇文章主要介绍mysql中表的知识点总结,在日常操作中,相信很多人在mysql中表的知识点总结问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答mysql中表的知识点总结的疑惑有所帮助!接下来,请跟着小编一起来学习吧! 1. 表
mysql中表的知识点总结
         这篇文章主要介绍“mysql中表的知识点总结”,在日常操作中,相信很多人在mysql中表的知识点总结问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql中表的知识点总结”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
 
1.  表
创建表的原则:
 
l  禁止使用中文做字段名;
 
l  禁止使用字符型做主键;
 
l  禁止无主键或唯一索引;
 
1.1.  整型
int、tinyint是使用最多的整型类型。
 
主键选择:
 
为什么要选择ID做主键:主键字段要选择不经常修改的、尽量与业务无关、无具体含义的。因为InnoDB是索引组织表,需要保证索引结构不经常防撞,避免造成性能的消耗。
 
int(4) 和int(10)都是占用4字节空闲,区别就是数据库中表示的数据位数,一个4位一个10位。有些在数字前自动用0补位。
 
1.2.  浮点型
常用decimal存储金钱字段,但在运算过程中会转成浮点运算,且会出现四舍五入的情况,建议使用int类型。
 
decimal(M,D);
 
D是小数部分位数,超过小数部分四舍五入截断,不足补足;
 
M是整数部分加小数部分的总长度,即插入整数部分不能超过M-D位,否则插入失败。
 
1.3.  时间类型
datetime:5.6前占8个字节,5.6后占5个字节,可用范围比timestamp大,物理存储上仅比timestamp多一个字节;
 
可以用int存储时间,通过两个函数转换:unix_timestamp和from_unixtime。
 
 [mysql]>select unix_timestamp('2018-11-06 16:42:00');
 
+---------------------------------------+
 
| unix_timestamp('2018-11-06 16:42:00') |
 
+---------------------------------------+
 
|                            1541493720 |
 
+---------------------------------------+
 
 [mysql]>select from_unixtime(1541493720);
 
+---------------------------+
 
| from_unixtime(1541493720) |
 
+---------------------------+
 
| 2018-11-06 16:42:00       |
 
+---------------------------+
 
从5.6开始,datetime和timestamp都支持自动更新为当前时间。
 
1.4.  字符串类型
text和blob这种大数据类型建议不要和业务表放一起。
 
char和varchar区别
 
char:用于定长字符串,范围0~255,不够空格补全存库;超过截断;
 
varchar:变长,范围0~65535,不够不补;超过截断;可节约空间提高存储效率。
 
varchar多用一到两个字节记录长度,数据位占用字节小于255用1字节记录长度;超过255则用2字节;还有一位用来记录是否为null值;
 
示例:varchar(100)
 
UTF8字符集:存储空间100*3+1=301字节;
 
GBK字符集:存储空间100*2+1=201字节;
 
mysql每行最大字节数65535,不同字符集下字符最大长度;
 
使用UTF8,每个字符最多占3个字节,最大长度不能超过(65535-1-2)/3=21844
 
使用GBK,每个字符2字节,最大长度不超过(65535-1-2)/2=36766
 
存储IP,推荐用int存储,使用inet_aton和inet_ntoa两个参数;
 
[mysql]>select inet_aton('10.98.156.210');
 
+----------------------------+
 
| inet_aton('10.98.156.210') |
 
+----------------------------+
 
|                  174234834 |
 
+----------------------------+
 
[mysql]>select inet_ntoa(174234834);
 
+----------------------+
 
| inet_ntoa(174234834) |
 
+----------------------+
 
| 10.98.156.210        |
 
+----------------------+
 
1.5.  字符集
mysql数据库字符集包括字符集(character)和校对规则(collation)两个概念。
 
字符集:定义mysql数据库字符串的存储方式;
 
校对规则:定义比较字符串的方式。
 
常用字符集:
 
l  GBK:每个汉字两个字节。
 
l  Latin1:停用。5.1前默认,1汉字或字母占1字节。
 
l  UTF8:每个汉字3个字节。
 
l  UTF8mb4:是utf8的超集,每个汉字4个字节。5.7建议使用。
 
数据库配置文件中相关参数
 
[mysql]>show variables like '%character%';
 
+--------------------------+----------------------------------+
 
| Variable_name            | Value                            |
 
+--------------------------+----------------------------------+
 
| character_set_client     | utf8                             |
 
| character_set_connection | utf8                             |
 
| character_set_database   | utf8mb4                          |
 
| character_set_filesystem | binary                           |
 
| character_set_results    | utf8                             |
 
| character_set_server     | utf8mb4                          |
 
| character_set_system     | utf8                             |
 
| character_sets_dir       | /usr/local/mysql/share/charsets/ |
 
+--------------------------+----------------------------------+
 
避免汉字乱码,做到三线统一;
 
连接端的字符集必须是UTF8;
 
    操作系统字符集必须是UTF8,
 
mysql数据库字符集必须是UTF8;
 
[mysql]>s
 
--------------
 
mysql  Ver 14.14 Distrib 5.7.24, for linux-glibc2.12 (x86_64) using  EditLine wrapper
 
Connection id:             9
 
Current database:  mysql
 
Current user:         root@localhost
 
SSL:               Not in use
 
Current pager:             stdout
 
Using outfile:         ''
 
Using delimiter:     ;
 
Server version:             5.7.24-log MySQL Community Server (GPL)
 
Protocol version:   10
 
Connection:          Localhost via UNIX socket
 
Server characterset:      utf8mb4
 
Db     characterset:   utf8mb4
 
Client characterset:       utf8
 
Conn.  characterset:    utf8
 
UNIX socket:         /tmp/mysql.sock
 
Uptime:                 3 hours 6 min 28 sec
 
Threads: 1  Questions: 299  Slow queries: 3  Opens: 372  Flush tables: 1  Open tables: 144  Queries per second avg: 0.026
 
--------------
 
数据库临时修改字符集:命令行执行set names 字符集名称;
 
如:set names utf8
 
1.6.  表碎片产生的原因
delete操作产生数据碎片,碎片占用磁盘空间且读取效率低。
 
1.7.  碎片计算方法及整理过程
查看表统计信息:
 
[mysql]>show table status like 't'G;
 
*************************** 1. row ***************************
 
           Name: t
 
         Engine: InnoDB
 
        Version: 10
 
     Row_format: Dynamic
 
           Rows: 2
 
 Avg_row_length: 8192
 
    Data_length: 16384
 
Max_data_length: 0
 
   Index_length: 0
 
      Data_free: 0
 
 Auto_increment: 3
 
    Create_time: 2018-11-06 10:20:10
 
    Update_time: NULL
 
     Check_time: NULL
 
      Collation: utf8mb4_general_ci
 
       Checksum: NULL
 
 Create_options:
 
        Comment:
 
1 row in set (0.01 sec)
 
碎片大小计算
 
碎片大小=数据总大小-实际表空间文件大小
 
数据总大小=data_length+index_length
 
实际表空间文件大小=rows*avg_row_length
 
碎片大小MB=(数据总大小-实际表空间文件大小)/1024/1024
 
清除碎片的两种方法:
 
alter table table_name engine=innodb;会给表加写锁,时间长。
 
备份原表数据,删掉,重新导入新表中;
 
在线整理表结构的工具pt-online-schema-charge;
 
Mysql 5.7后已支持在线online ddl了。
 
1.8.  表统计信息
统计每个库大小
 
SELECT
 
       table_schema,
 
       sum(data_length) / 1024 / 1024 / 1024 AS data_length,
 
       sum(index_length) / 1024 / 1024 / 1024 AS index_length,
 
       sum(data_length + index_length) / 1024 / 1024 / 1024 AS sum_data_index
 
FROM
 
       information_schema. TABLES
 
WHERE
 
       TABLE_SCHEMA != 'information_schema'
 
AND TABLE_SCHEMA != 'mysql'
 
GROUP BY
 
       table_schema;
 
统计库中每个表大小
 
SELECT
 
       TABLE_NAME,
 
       SUM(DATA_LENGTH + INDEX_LENGTH) AS TOTAL_SIZE
 
FROM
 
       information_schema.`TABLES`
 
WHERE
 
       TABLE_SCHEMA = 'mysql'
 
GROUP BY
 
       TABLE_NAME;
 
统计所有数据的大小
 
SELECT
 
       SUM(DATA_LENGTH + INDEX_LENGTH) AS TOTAL_SIZE
 
FROM
 
       information_schema.`TABLES`;
 
1.9.  统计信息的收集方法
l  遍历information_schema_tables,收集su表的统计信息;
 
[mysql]>select * from information_schema.tables where table_name='t' G;
 
*************************** 1. row ***************************
 
  TABLE_CATALOG: def
 
   TABLE_SCHEMA: mysql
 
     TABLE_NAME: t
 
     TABLE_TYPE: BASE TABLE
 
         ENGINE: InnoDB
 
        VERSION: 10
 
     ROW_FORMAT: Dynamic
 
     TABLE_ROWS: 2
 
 AVG_ROW_LENGTH: 8192
 
    DATA_LENGTH: 16384
 
MAX_DATA_LENGTH: 0
 
   INDEX_LENGTH: 0
 
      DATA_FREE: 0
 
 AUTO_INCREMENT: 3
 
    CREATE_TIME: 2018-11-06 10:20:10
 
    UPDATE_TIME: NULL
 
     CHECK_TIME: NULL
 
TABLE_COLLATION: utf8mb4_general_ci
 
       CHECKSUM: NULL
 
 CREATE_OPTIONS:
 
  TABLE_COMMENT:
 
l  重启mysql实例
 
l  show table status like ‘%table_name%’;
 
[mysql]>show table status like 't'G;
 
*************************** 1. row ***************************
 
           Name: t
 
         Engine: InnoDB
 
        Version: 10
 
     Row_format: Dynamic
 
           Rows: 2
 
 Avg_row_length: 8192
 
    Data_length: 16384
 
Max_data_length: 0
 
   Index_length: 0
 
      Data_free: 0
 
 Auto_increment: 3
 
    Create_time: 2018-11-06 10:20:10
 
    Update_time: NULL
 
     Check_time: NULL
 
      Collation: utf8mb4_general_ci
 
       Checksum: NULL
 
 Create_options:
 
        Comment:
 
1 row in set (0.01 sec)
 
1.10.    MySQL库表常用命令总结
登陆同时修改命令提示符:主机-用户-数据库-日期 mysql -uroot -p --prompt='h-u-d-D'
 
退出:exit  quit  q
 
命令行结束符号:;或g
 
c 取消当前命令执行,就不用删除了;
 
MySQL注释: #  或 --
 
s  实例信息;
 
show database;显示实例下所有数据库;
 
show schemas; 显示实例下所有数据库;
 
show warings;查看警告
 
use database;选择数据库;
 
show full processlist;查看数据库当前连接情况;
 
select user();得到登陆用户
 
select version();得到版本信息;
 
select now();得到当前日期时间;
 
seleect database();得到当前打开数据库;
 
create database db_name;创建数据据库;
 
create databse if not exists test1; 检测数据库不存在则创建
 
create databse if not exists test1 default character set 'utf8';创建时指定编码方式
 
show create database dbname;查看数据库信息     
 
alter databse dbname default character set 'gbk';修改指定数据库的编码方式
 
drop database db_name;删除数据库;
 
show tables;查看库下所有表;
 
show create table tab_name G; 查看建表语句;
 
desc tab_name;查看表结构;
 
show table status;获取表基础信息;
 
show index from tab_name;查看当前表下索引情况;
 
create table tab_name:创建表;
 
drop table tab_name;删除表包括结构;
 
select * from tab_name;
 
delete from tab_name where ;或truncate table tab_name;
 
insert into tab_name (字段列表) values(对应字段值)
 
update tab_name set :字段名=某值(where);
 
到此,关于“mysql中表的知识点总结”的学习就结束了,希望能够解决大家的疑惑。

(编辑:92站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读