mysql 总结一 * 区别 索引 视图 存储

Mysql中有哪几种锁?

1.表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

2.行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

3.页面锁:开销和加锁时尚界于表锁和行锁之间,并发度一般。

 

mysql中有哪些不同的表格? 5种

myisam、Heap、merge、innodb、isam

 

 

MYISAM和Innodb区别

myisam表引擎:

1.  5.1版本前,myisam是默认的存储引擎。

2. 支持全文索引,压缩空间函数。

3.不支持事务,但是每次查询都是原子的;不支持行锁,不支持外键,不支持崩溃后的安全恢复;

4.支持表锁,即每次操作是对整个表加锁;

5.每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。

6.用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。也可以通过lock table命令来锁表,这样操作主要是可以模仿事务,但是消耗非常大,一般只在实验演示中使用。

7.存储表的总行数;

8.采用非聚集索引,索引文件的数据域存储指向数据文件的指针。副索引与主索引基本一致,但是副索引不用保证唯一性。

 

Innodb表引擎:

1.默认事务引擎,最重要最广泛的存储引擎,性能非常优秀;

2.支持ACID的事务,支持事务的四种隔离级别;

3.支持行锁以及外键约束,因此可以支持写并发,采用MVCC多版本控制,来支持高并发;

4.不存储总行数;

5.所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。

5.一个innodb引擎存储在一个文件空间(共享空间,表大小不受操作系统控制,一个表可以分布在多个文件里),也有可能为多个(设置为独立表空间,表大小受操作系统文件大小限制,一般为2G),受操作系统文件大小的限制。可以配置文件分开。

6.对主键查询的性能高于其他类型的存储引擎;主键索引采用聚簇索引(索引的数据域存储数据文件本身),副索引的数据域存储主键的值;因此从副索引查找数据,需要先通过副索引找到主键值,再访问副索引;最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。

7.内部做了很多优化,从磁盘读取数据时自动在内存构建hash索引,插入数据时自动构建插入缓冲区。

8.通过一些机制和工具支持真正的热备份。

9.支持崩溃后的安全恢复。

10.不支持全文索引;innodb聚簇索引比myisam非聚簇索引 快。

 

mysql中Innodb支持的四种事务隔离级别名称,以及逐级之间的区别?

sql标准定义的四个隔离级别:

1. read uncommited 读到未提交数据

2. read committed 脏读 ,不可重复读

3. repeatable read 可重复读 默认

4. serializable 串行事务

 

char 和 varchar的区别?

1.char 和 varchar 类型在存储和检索方面有所不同。

2.char列长度固定为创建表时声明的长度,长度值范围是1到255. (定长,根据定义的字符串长度分配足够的空间)

3.当char值被存储时,它们被用空格填充到特定长度,检索char值时需删除尾随空格。

4.适合存储很短的字符串,或者所有值都接近同一个长度。

5.char长度 超出设定的长度会被截断。

6.对于经常变更的数据,char比varchar更好,char不容易产生碎片。

对于非常短的列,char比varchar在存储空间上更有效率,只分配真正需要的空间,更长的列会消耗更多的内存。

 

主键和候选键有什么区别?

表格的每一行都由主键唯一标识,一个表只有一个主键。

主键也是候选键。按照惯例,候选键可以被指定为主键,并且可以用于任何外键引用。

 

表格定义的所有索引?

索引是通过以下方式为表格定义的: show index from <tablename>;

 

like声明中的 % 和 _  是什么意思?

%对应于0个或更多字符, _  只是like语句中的一个字符。 

 

如何在unix和mysql时间戳之间进行转换?

UNIX_TIMESTAMP是从mysql时间戳转换为unix时间戳的命令。

FROM_UNIXTIME是从时间戳转换为mysql时间戳的命令。

 

列对比运算符是什么?

在SELECT语句的列比较中使用 =,<>,<=,<,>=,>,<<,>>,<=>,AND,OR或like运算符。

 

BLOB和TEXT有什么区别?

1.尽量避免使用BLOB/text类型,查询会使用临时表,导致严重的性能开销。

2.BLOB是一个二进制对象,可以容纳可变数量的数据。 TEXT是一个不区分大小写的BLOB。

3.BLOB和TEXT类型之间的唯一区别在于对BLOB值进行排序和比较时,区分大小写,对TEXT值不区分大小写。

 

mysql_fetch_array 和 mysql_fetch_object 和 mysql_fetch_rows的区别是什么?

mysql_fetch_array()  将结果行作为关联数据或来自数据库的常规数据返回。

mysql_fetch_objetc()  从数据库返回结果行作为对象。

 

mysql 如何优化DISTINCT?  distinct

distinct在所有列上转换为group by,并与order by子句结合使用。

 

可以使用多少列创建索引?

最多可以创建16个索引列。

 

如果一个表有一列定义为TIMESTAMP,将发生什么?

每当行被更改时,时间戳字段将获取当前时间戳。

 

列设置为AUTO_INCREMENT时,如果在表中达到最大值,会发生什么情况?

会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。

 

怎样才能找出最后一次插入时分配了哪个自动增量?

LAST_INSERT_ID将返回由AUTO_INCREMENT分配的最后一个值,并且不需要指定表名称。

 

NOW() 和 CURRENT_DATE() 由什么区别?

NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒。

CURRENT_DATE() 仅显示当前年份,月份和日期。

 

什么是非标准字符串类型?

1.TINYTEXT

2.TEXT

3.MEDIUMTEXT

4.LONGTEXT

 

什么是通用SQL函数?

1.CONCATAT(A,B)  连接两个字符串值以创建单个字符串输出。通常用于将两个或多个字段合并为一个字段。

2.FORMAT(X,D)  格式化数字X到D有效数字。

3.CURRDATE(), CURRTIME()  返回当前日期或时间

4.NOW()  将当前日期和时间作为一个值返回。

5.MONTH(), DAY(), YEAR(), WEEK(), WEEKDAY()  从日期值中提取给定数据。

6.HOUR(), MINUTE(), SECOND()   从时间值中提取给定数据。

7.DATEDIFF(A,B)  确定两个日期之间的差异,通常用于计算年龄。

8.SUBTIMES(A,B)   确定两次之间的差异。

9.FEOMDAYS(INT)   将整数天数转换为日期值。

 

mysql支持事务吗?

在缺省模式下,mysql是autocommit模式的,所有的数据库更新操作都会及时提交,所以在缺省情况下,mysql是不支持事务的。

但是如果你的mysql表类型是使用innodb tables 或BDB tables的话,你的mysql就可以使用事务处理,使用set autocommit模式,在非autocommit模式下,你必须使用commit来提交你的更改,或者用rollback来回滚你的更改。

 

mysql里记录货币用什么字段类型好?

NUMERIC和DECIMAL类型被mysql实现为同样的类型,这在SQL92标准允许。他们被用于保存值,该值的准确精度是极其重要的值,

例如与金钱有关数据。当声明一个类是这些类型之一时,精度和规模的能被(并且通常是)指定。

例如:salary  decimal(9,2);

在这个例子中,9(precision)代表将被用于存储值的总得小数位数,而2(scale)代表将被用于存储小数点后的位数。

因此,在这种情况下,能被存储在salary列中的值得范围是从-9999999.99到9999999.99.

 

mysql有关权限的表有哪几个?

mysql服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。

 

列的字符串类型可以是什么?

set    blob  enum   char   text

mysql数据库做发布系统的存储,数据量增大的情况,怎么优化?

1.设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。

2.选择合适的表字段数据类型和存储引擎,适当的添加索引。

3.mysql库主从读写分离。

4.找规律分表,减少单表中的数据量提高查询速度。

5.添加缓存机制,比如memcached,apc等。

6.不经常改动的页面,生成静态页面。

7.书写高效率的sql.

 

锁的优化策略:

1.读写分离

2.分段加锁

3.减少锁持有的时间

4.多个线程尽量以相同的顺序去获取资源。

不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁。

 

索引的底层实现原理和优化:

B+树    经过优化的B+树

主要是在所有的叶子结点中增加了指向下一个叶子节点的指针,因此innodb 建议为大部分表使用默认自增的主键作为主索引。

 

什么情况下设置了索引但无法使用:

1.以 % 开头的like语句,模糊匹配; int 类型 like 不匹配。

2. or语句前后没有同时使用索引。

3.数据类型出现隐士转化(如varchar不加单引号的话可能会自动转换为int型)。

4.不等于 或 not  null 

 

实践中如何优化mysql:

1.sql 语句以及索引的优化。

2.数据库表结构的优化。

3.系统配置的优化。

4.硬件的优化。

 

优化数据库的方法:

1.选取最适用的字段属性,尽可能减少定义字段宽度,尽量把字段设置not null,例如 省份、性别 最好适应enum.

2.使用连接join来代替子查询。

3.适用联合union来代替手动创建的临时表

4.事务处理

5.锁定表、优化事务处理

6.使用外键,优化锁定表

7.建立索引。

8.优化查询语句

 

简单描述mysql中,索引 ,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)?

索引是一种特殊的文件(innodb数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。

普通索引(由关键字key或index定义的索引)的唯一任务是加快对数据的访问速度。

 

普通索引允许被索引的数据列包含重复的值,如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字unique把它定义为一个唯一索引。也就是说,唯一索引可以保证数据记录的唯一性。

 

主键:是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字primary key来创建。

 

索引可以覆盖多个数据列,如像index(columnA,columnB)索引,这就是联合索引。

 

索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度,因为在执行这些写操作时,还要操作索引文件。

 

数据库中的事务是什么?

事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。

 

事务特性:

1.原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。

2.一致性或可串行:事务的执行使得数据库从一种正确状态转换成另一种正确状态。

3.隔离性:在事务正确提交之前,不允许把该事务对数据的任何改变提供任何其他事务。

4.持久性:事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性、一致性、隔离性、持久性。

 

SQL注入漏洞产生的原因?如何防止?

原因:程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。

防止:开启配置文件中的magic_quotes_gpc和magic_quotes_runtime设置。

执行sql语句时使用addslashes进行sql语句转换。sql语句书写尽量不要省略双引号和单引号。

过滤掉sql语句中的一些关键词:update、select、insert、delete、*.

提高数据库表和字段的命名技巧,对一些重复的字段类型程序的特点命名,取不易被猜到的。

为表中字段选择合适的数据类型

优先级:int >date,time>enum,char>varchar>blob,text

优先考虑数字类型,其次是日期或二进制类型,最后是字符串类型。同级别得数据类型,应优先选择占用空间小的数据类型。

 

存储时期

datatime : 以 YYYY-MM-DD HH:MM:SS 格式存储日期时间,精确到秒,占用8个字节的存储空间;存储于时区无关。

timestamp:以时间戳格式存储,占用4个字节,范围小1970-1-1到2038-1-19,显示依赖于所指定的时区,默认在第一列行的数据修改时可以自动得修改timestamp列得值。

date:(生日)占用的字节数比使用字符串、datatime、int存储要少,使用date只需要3个字节,存储日期月份,还可以利用日期时间函数进行日期得计算。

time:存储时间部分的数据

注意:不要使用字符串类型来存储日期时间数据(通常比字符串占用的存储空间小,在进行查找过滤可以利用日期函数)

使用int存储日期时间不如使用timestamp类型

 

对于关系型数据库而言,索引是相当重要的。回答有关索引的几个问题?

1.索引的目的是什么?

快速访问数据表中的特定数据,提高查询速度;降低写操作速度,占用磁盘空间。(减少服务器需要扫描的数据量)

帮助服务器避免排序和临时表;

将随机I/O 变为顺序I/O;

创建唯一索引,保证数据库表中每一行数据的唯一性。可以为NULL。 (不能not null,不能有默认值)

加速表和表之间的连接。

使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

2.索引对数据库系统的负面影响是什么?

负面:

 创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;

当对表进行增删改查的时候,索引也要动态维护,这样就降低了数据的维护速度。

3.为数据表建立索引的原则有哪些?

在最频繁使用的、用以缩小查询范围的字段上建立索引。where 条件 或 on 关联表查询的 关联列

在频繁使用的。需要排序的字段上建立索引。

4.什么情况下不宜建立索引?

对于查询中很少涉及的列或重复值比较多的列,不宜建立索引。

对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等。

 

解释mysql外链接、内连接与自连接的区别?

交叉连接:又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配。

内连接:是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的行。

外链接:其结果集中不包含符合连接条件的行,而且会包括左表、右表或两个表的所有数据行,这三种情况依次称为左外连接、右外连接和全外连接。

左外连接:也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那些在右表中并没有匹配的记录,扔显示,右表对应的那些字段值以NULL来填充。

右外连接:也称右连接,右表为主表。与左连接相反。mysql目前不支持全外连接。

 

mysql中事务回滚机制概述?

事务是用户定义的一个数据库操作序列,这些操作要么全做要么全部不做,是一个不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销。

 

要同时修改数据库中两个不同表时,如果他们不是一个事务的话,当第一个表修改完,可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依旧是未修改之前的状态,而第一个表已经被修改完毕。而当你把它们设定为一个事务的时候,当第一个表修改完,第二个表修改出现异常而没有被修改,第一个表和第二个表都要回到未修改的状态,这就是所谓的事务回滚。

 

SQL语言包含哪几部分?每部分都有哪些操作关键字?

sql语言包括数据定义(DDL)、数据操纵(DML),数据控制(DCL)和数据查询(DQL)四个部分。

数据定义:CREATE TABLE,ALTER TABLE,DROP TABLE,CREATE/DROP INDEX.

数据操纵:select insert  update delete

数据控制:grant  revoke

数据查询:select

 

完整性约束包括哪些?

数据完整性(data integrity)是指数据的精确(accuracy)和可靠性(reliability)。

分为以下四类:

1》实体完整性:规定表的每一行在表中是唯一的实体。

2》域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括取值范围、精度等规定。

3》参照完整性:是指两个表的主关键字和外关键字的数据应一致,保证了表之间的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。

4》用户定义的完整性:不用的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件,他反应某一具体应用必须满足的语义要求。

与表有关的约束:包括列约束(not null 非空约束)和表约束(primary key、foreign key、check、unique)

什么是锁?

数据库是一个多用户使用的共享资源。当多个用户并发的存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。

 

基本锁类型:锁包括行级锁和表级锁。

什么叫视图?游标是什么?

视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增改查操作,视图通常是有一个表或多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

游标:是对查询处来的结果作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

什么是存储过程?用什么来调用?

存储过程是一个预编译的sql语句,有点事允许模块化设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次sql,使用存储过程比单纯sql语句执行要快。可以用一个命令对象来调用存储过程。

 

如何通俗的理解三个范式?

第一范式:对属性的原子性约束,要求属性具有原子性,不可再分解;

第二范式:对记录的唯一性约束,要求记录有唯一标识,即实体的唯一性;

第三范式:对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余 。

 

范式设计优缺点:

优点:可以尽量的减少数据冗余,使得更新快,体积小

缺点:对于查询需要多个表进行关联,减少写的效率,增加读的效率,更难进行索引优化。

 

反范式化:

优点:可以减少表的关联,可以更好的进行索引优化。

缺点:数据冗余以及数据异常,数据得修改需要更多的成本。

什么是基本表?什么是视图?

基本表是本身独立存在的表,在sql中一个关系对应一个表。视图是从一个或几个基本表到处的表。视图本身不独立存储在数据库中,是一个虚表。

试述视图的优点?

1.视图能够简化用户的操作。

2.视图使用户能以多种角度看待同一数据。

3.视图为数据库提供了一定程度的逻辑独立性。

4.视图能够对机密数据提供安全保护。

 

NULL是什么意思?

NULL这个值表示UNKNOWN(未知),它不表示“”(空字符串)。对NULL这个值的任何比较都会生产一个NULL值。您不能把任何值与一个NULL值进行比较,并在逻辑上希望获得一个答案。

使用IS NULL来进行NULL判断。

 

主键、外键和索引的区别?

主键  :唯一标识一条记录,不能有重复的,不允许为空。

外键:表的外键是另一表的主键,外键可以有重复的,可以是空值。

索引:该字段没有重复值,但可以有一个空值。

作用:

主键:用来保证数据完整性。

外键:用来和其他表建立联系用的。

索引:提高查询排序的速度。

个数:

主键 :主键一个表只有一个

外键:一个表可以有多个外键

索引:一个表可以有多个唯一索引

 

你可以用什么来确保表格里的字段只接受特定范围的值?

check限制,它在数据库表格里被定义,用来限制输入该列的值。

触发器也可以被用来限制数据库表格里的字段能够接受的值,但是这种办法要求触发器在表格里被定义,这可能会在某些情况下影响到性能。

 

说说对SQL语句优化有哪些方法?

1.where子句中:where表之间的连接必须写在其他where条件之前,那些可以过滤掉最大数据记录的条件必须写在where子句的末尾,having最后。

2.用exists替代in 、用not exists 替代not in.

3.避免在索引列上使用计算。

4.避免在索引列上使用is null 和is not null

5.对查询进行优化,应尽量避免全表扫描,首先应考虑在where以及order by 涉及的列上建立索引。

6.应尽量避免在where子句中对字段进行null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。

7.应尽量避免在where子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。

 

复合索引的优点和注意事项

 

概念:
    单一索引是指索引列为一列的情况,即新建索引的语句只实施在一列上;
    用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引);
    复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引;
    同时有两个概念叫做窄索引和宽索引,窄索引是指索引列为1-2列的索引,宽索引也就是索引列超过2列的索引;
    设计索引的一个重要原则就是能用窄索引不用宽索引,因为窄索引往往比组合索引更有效;

使用:
    创建索引
    create index idx1 on table1(col1,col2,col3)
    查询
    select * from table1 where col1= A and col2= B and col3 = C
    这时候查询优化器,不在扫描表了,而是直接的从索引中拿数据,因为索引中有这些数据,这叫覆盖式查询,这样的查询速度非常快;

注意事项:
    1、对于复合索引,在查询使用时,最好将条件顺序按找索引的顺序,这样效率最高;
    select * from table1 where col1=A AND col2=B AND col3=D
    如果使用 where col2=B AND col1=A 或者 where col2=B 将不会使用索引

    2、何时是用复合索引
    根据where条件建索引是极其重要的一个原则;
    注意不要过多用索引,否则对表更新的效率有很大的影响,因为在操作表的时候要化大量时间花在创建索引中

    3、复合索引会替代单一索引么
    如果索引满足窄索引的情况下可以建立复合索引,这样可以节约空间和时间


备注:
    对一张表来说,如果有一个复合索引 on (col1,col2),就没有必要同时建立一个单索引 on col1;
    如果查询条件需要,可以在已有单索引 on col1的情况下,添加复合索引on (col1,col2),对于效率有一定的提高
    同时建立多字段(包含5、6个字段)的复合索引没有特别多的好处,相对而言,建立多个窄字段(仅包含一个,或顶多2个字段)的索引可以达到更好的效率和灵活性。

 

 

表引擎  字符集

表字段 名称 类型 长度 字符集 默认值 注释 

1、        剔除关系不密切的字段

2、        字段命名要有规则及相对应的含义(不要一部分英文,一部分拼音,还有类似a.b.c这样不明含义的字段)

3、        字段命名尽量不要使用缩写(大多数缩写都不能明确字段含义)

4、        字段不要大小写混用(想要具有可读性,多个英文单词可使用下划线形式连接)

5、        字段名不要使用保留字或者关键字

6、        保持字段名和类型的一致性

7、        慎重选择数字类型

8、        给文本字段留足余量

  表结构合理性配置

1、        多型字段的处理

就是表中是否存在字段能够分解成更小独立的几部分(例如:人可以分为男人和女人)

2、        多值字段的处理

可以将表分为三张表

这样使得检索和排序更加有调理,且保证数据的完整性!

其它建议

1、        对于大数据字段,独立表进行存储,以便影响性能(例如:简介字段)

2、        使用varchar类型代替char,因为varchar会动态分配长度,char指定长度是固定的。

3、        给表创建主键,对于没有主键的表,在查询和索引定义上有一定的影响。

4、        避免表字段运行为null,建议设置默认值(例如:int类型设置默认值为0)在索引查询上,效率立显!

5、        建立索引,最好建立在唯一和非空的字段上,建立太多的索引对后期插入、更新都存在一定的影响(考虑实际情况来创建)。

CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` char(30) NOT NULL DEFAULT '' COMMENT '用户名',
  `realname` char(30) NOT NULL DEFAULT '' COMMENT '真实姓名',
  `idcard` char(50) NOT NULL DEFAULT '' COMMENT '身份证号码',
  `mobile` char(15) NOT NULL DEFAULT '' COMMENT '手机号',
  `level` char(5) DEFAULT '' COMMENT '证书等级 s1-s8',
  `status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '认证状态 1未认证 2 已认证',
  `operate_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '操作人id',
  `create_time` int(10) unsigned DEFAULT '0' COMMENT '创建时间',
  `update_time` int(10) unsigned DEFAULT '0' COMMENT '修改时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表';

posted @ 2018-11-17 02:31  玲汐  阅读(471)  评论(0编辑  收藏  举报