mysql创建表

MySQL大表优化方案

☆樱花仙子☆ 提交于 2019-12-07 15:07:34
当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在 千万级 以下,字符串为主的表在 五百万 以下是没有太大问题的。而事实上很多时候MySQL单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量: 字段 尽量使用 TINYINT 、 SMALLINT 、 MEDIUM_INT 作为整数类型而非 INT ,如果非负则加上 UNSIGNED VARCHAR 的长度只分配真正需要的空间 使用枚举或整数代替字符串类型 尽量使用 TIMESTAMP 而非 DATETIME , 单表不要有太多字段,建议在20以内 避免使用NULL字段,很难查询优化且占用额外索引空间 用整型来存IP 索引 索引并不是越多越好,要根据查询有针对性的创建,考虑在 WHERE 和 ORDER BY 命令上涉及的列建立索引,可根据 EXPLAIN 来查看是否用了索引还是全表扫描 应尽量避免在 WHERE 子句中对字段进行 NULL 值判断,否则将导致引擎放弃使用索引而进行全表扫描 值分布很稀少的字段不适合建索引,例如"性别"这种只有两三个值的字段 字符字段只建前缀索引 字符字段最好不要做主键 不用外键,由程序保证约束 尽量不用 UNIQUE

Mysql数据库调优

╄→гoц情女王★ 提交于 2019-12-07 01:55:05
1. 简介 在Web应用程序体系架构中,数据持久层(通常是一个关系数据库)是关键的核心部分,它对系统的性能有非常重要的影响。MySQL是目前使用最多的开源数据库,但是MySQL数据库的默认设置性能非常的差,仅仅是一个玩具数据库。因此在产品中使用MySQL数据库必须进行必要的优化。 优化是一个复杂的任务,本文描述MySQL相关的数据库设计和查询优化,服务器端优化,存储引擎优化。 2. 数据库设计和查询优化 在MySQL Server性能调优中,首先要考虑的就是Database Schema设计,这一点是非常重要的。一个糟糕的Schema设计即使在性能调优的MySQL Server上运行,也会表现出很差的性能;和Schema相似,查询语句的设计也会影响MySQL的性能,应该避免写出低效的SQL查询。这一节将详细讨论这两方面的优化。 2.1 Schema Design Schema的优化取决于将要运行什么样的query,不同的query会有不同的Schema优化方案。2.2节将介绍Query Design的优化。Schema设计同样受到预期数据集大小的影响。Schema设计时主要考虑:标准化,数据类型,索引。 2.1.1 标准化 标准化是在数据库中组织数据的过程。其中包括,根据设计规则创建表并在这些表间建立关系;通过取消冗余度与不一致相关性,该设计规则可以同时保护数据并提高数据的灵活性

mysql查询表索引

非 Y 不嫁゛ 提交于 2019-12-06 22:39:02
本文转自夏日博客 https://www.xiariboke.com/article/4061.html MySQL查询表索引命令的有两种命令形式,代码如下: mysql> SHOW index FROM `tblname`; 或者: mysql> SHOW keys FROM `tblname`; 运行以上命令得到的结果,下面将将所得的结果中每列的意思做一下说明. Table 表的名称。 Non_unique 如果索引不能包括重复词,则为0。如果可以,则为1。 Key_name 索引的名称。 Seq_in_index 索引中的列序列号,从1开始。 Column_name 列名称。 Collation 列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。 Cardinality 索引中唯一值的数目的估计值,通过运行ANALYZE TABLE或myisamchk -a可以更新,基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的,基数越大,当进行联合时,MySQL使用该索引的机会就越大. Sub_part 如果列只是被部分地编入索引,则为被编入索引的字符的数目,如果整列被编入索引,则为NULL. Packed 指示关键字如何被压缩,如果没有被压缩,则为NULL. Null 如果列含有NULL,则含有YES,如果没有

mysql 查询指定数据库所有表, 指定表所有列, 指定列所有表 所有外键及索引, 以及索引的创建和删除

送分小仙女□ 提交于 2019-12-06 22:34:48
查询指定 数据库 中所有 表 (指定数据库的,所有表) // 可以把 TABLE_NAME 换成 * 号, 查看更丰富的信息 SELECT TABLE_NAME FROM information_schema. TABLES WHERE table_schema = '数据库名' // where 后面还有更多的条件选择,比如只查出以 oauth_表开头的表 AND TABLE_NAME LIKE 'oauth_%' ; 查询指定 数据库 中,指定 表 的所有 字段 (指定表的,所有列) SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE table_schema = '数据库名' AND table_name = '表名' 查询指定 数据库 所有表中, 含有 某个字段 的表 (指定列的,所有表) SELECT table_name FROM information_schema. COLUMNS WHERE table_schema = '数据库名' AND table_name in ( SELECT TABLE_NAME FROM information_schema. TABLES WHERE table_schema = '数据库名' ) AND COLUMN_NAME = '字段名' ; 查询指定 数据库

MySQL修改表列名

亡梦爱人 提交于 2019-12-06 22:31:04
京东2016实习生招聘 Java开发工程师 在MySql中,如果要修改表的列名,下列语句的语法正确的是 A ALTER TABLE 表名字 CHANGE 列名称 新列名称 B ALTER TABLE 表名字 ALTER 列名称 新列名称 C ALTER TABLE 表名字 MODIFY列名称 新列名称 D ALTER TABLE 表名字 列名称 新列名称 正确答案 : A 知识点 修改某个表的字段类型及指定为空或非空 alter table 表名称 change 字段名称 新字段名称 字段类型 [是否允许非空]; alter table 表名称 modify 字段名称 字段类型 [是否允许非空]; 扩展 创建数据库 > CREATE DATABASE database-name 删除数据库 >drop database dbname 查询所有数据表 >show tables; 查询表的字段信息 > desc 表名称; 添加表字段 >alter table table1 add transactor varchar( 10 ) not Null; >alter table table1 add id int unsigned not Null auto_increment primary key 如果要删除某一字段,可用命令: >ALTER TABLE 表名称 DROP 字段名;

MySQL(三)—— 表的约束

北战南征 提交于 2019-12-06 17:26:09
一、概念 约束:对表中的数据进行限定,保证数据的正确性、有效性和完整性。 二、分类 1.主键约束:primary key 2.非空约束:not null 3.唯一约束:unique 4.外键约束:foreign key 三、非空约束 not null,被修饰列值不能为空 1.创建表时添加非空约束 create table student(id int, name varchar(32) not null); -- name为非空 2.删除非空约束 alter table student modify name varchar(32); 3.创建表完成后,添加非空约束 alter table student modify name varchar(32) not null; 四、唯一约束 unique,被修饰列值不能重复 1.创建表时添加唯一约束 create table student(id int, phone_number varchar(20) unique); -- phone_number列添加了唯一约束 2.删除唯一约束 alter table student drop index phone_number; 3.创建表完成后,添加唯一约束 alter table student modify phone_number varchar(20) unique; 注意

数据库----mysql表的约束和查询

江枫思渺然 提交于 2019-12-06 16:16:30
一,mysql中表的约束   为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以 确保数据库中存储的数据正确、有效、相容。 约束条件与数据类型的宽度一样,都是可选参数,主要分为以下几种: NOT NULL :非空约束,指定某列不能为空; 是否可空,null表示空,非字符串 not null - 不可空 null - 可空 mysql> create table t12 (id int not null); Query OK, 0 rows affected (0.02 sec) mysql> select * from t12; Empty set (0.00 sec) mysql> desc t12; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | id | int(11) | NO | | NULL | | +-------+---------+------+-----+---------+-------+ 1 row

多表操作

流过昼夜 提交于 2019-12-06 06:41:53
1.外键 1.1:什么是外键 为了了解外键,我们先创两张表 mysql> USE itcast; Database changed 创建完成第一张表 mysql> CREATE TABLE class(id INT(11) PRIMARY KEY,name VARCHAR(20))ENGINE=INNODB; Query OK, 0 rows affected 给第一张表添加数据 mysql> INSERT INTO class(id,name) VALUES(1913,"上午班"),(1923,"下午班"); Query OK, 2 rows affected Records: 2 Duplicates: 0 Warnings: 0 创建第二张表 mysql> CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(20),class_id INT(11))ENGINE=INNODB; Query OK, 0 rows affected 给第二张表添加数据 mysql> INSERT INTO student(id,name,class_id) VALUES (191301,"张三",1913),(192301,"李四",1923),(191302,"王二",1913); Query OK, 3 rows affected

MySQL技术内幕4表

喜欢而已 提交于 2019-12-06 05:24:50
4.1索引组织表 如果在创建表时没有显式地定义主键,则InnoDB存储引擎会按照如下方式选择或者创建主键: 首先判断表中是否有非空的唯一索引,如果有,则该列为主键 如果不符合以上条件,InnoDB存储引擎自动创建一个6字节大小的指针 当表中有多个非空唯一索引时,InnoDB存储引擎将选择第一个定义的非空唯一索引为主键。需要注意的是,主键的选择是根据定义索引的顺序,而不是建表时列的顺序。 当没有显示的声明主键或者声明单列主键时,可以用_rowid来查询自动生成的表的主键;_rowid只能用于查询单个列表作为主键的情况,对于多列组成的主键无能为力 4.2InnoDB逻辑存储结构 所有数据被逻辑的存放在表空间中,表空间又由段segment,区extent,页page组成。 4.2.1表空间 4.2.2段 常见的段有数据段、索引段和回滚段。 数据段即B+树的叶子节点,索引段即为B+树的非叶子节点。 4.2.3区 区是由连续页组成的空间,在任何情况下每个区的大小都为1MB。为了保证区中页的连续性,InnoDB存储引擎一次从磁盘申请4~5个区。在默认情况下,InnoDB存储引擎页的大小为16KB,即一个区中一共有64个连续的页 来源: https://www.cnblogs.com/zhouyu0-0/p/11963869.html

MySQL8.0 新特性 Hash Join

女生的网名这么多〃 提交于 2019-12-06 04:29:20
概述&背景 MySQL一直被人诟病没有实现HashJoin,最新发布的8.0.18已经带上了这个功能,令人欣喜。有时候在想,MySQL为什么一直不支持HashJoin呢?我想可能是因为MySQL多用于简单的OLTP场景,并且在互联网应用居多,需求没那么紧急。另一方面可能是因为以前完全靠社区,这种演进速度毕竟有限,Oracle收购MySQL后,MySQL的发版演进速度明显加快了很多。 HashJoin本身算法实现并不复杂,要说复杂,可能是优化器配套选择执行计划时,是否选择HashJoin,选择外表,内表可能更复杂一点。不管怎样现在已经有了HashJoin,优化器在选择Join算法时又多了一个选择。MySQL本着实用主义,相信这个功能增强也回应了一些质疑,有些功能不是没有能力做好,而是有它的优先级。 在8.0.18之前,MySQL只支持NestLoopJoin算法,最简单的就是Simple NestLoop Join,MySQL针对这个算法做了若干优化,实现了Block NestLoop Join,Index NestLoop Join和Batched Key Access等,有了这些优化,在一定程度上能缓解对HashJoin的迫切程度。下文会单独拿一个章节讲MySQL的这些Join优化,下面先讲HashJoin。 Hash Join算法 NestLoopJoin算法简单来说