mysql学习笔记

  • 格式:wps
  • 大小:110.23 KB
  • 文档页数:10

MysqlMYSQL的基本操作表操作1.创建表a)Create table user()b)create table user(id int not null auto_increment primarykey,name varchar(12) not null);如果你是脚本建表的话就create table ab(id int primary key identity(1,1) notnull//ID为主键且自动增长)2.查看表a)Select * from user;b)Select * from user where id = 1;3.查看表结构a)Desc user 查看名为user的表的结构4.修改表结构a)修改表名:alert table user rename to t_user;b)修改列名:alert table user change name username varchar(12);c)添加列:alter table user add column age int;d)删除列: alter table user drop column name;e)修改列属性:alter table user modify name char(12);5.表字段的修改限制a)当表中没有数据的时候,字段的类型可以任意修改b)当表中已有数据,那么只能修改同种类型的属性如:char和varchar6.列出所有表a)Show tables [in dbname] 括号中的库名可以省略,默认指的是当前数据库7.列出所有的系统表a)8.查看列a)也就是查看表的结构desc user9.重组表(用来优化数据库性能的)a)Optimize table 是表碎片整理b)OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用数据操作1.插入数据3.修改数据4.删除数据5.导出数据6.导入数据7.导出数据库的所有表数据8.导入数据库所有的数据索引1.创建索引a)Create index indexname on tablename(列名们);b)Alter table user add index indexname(列名们);c)Alter table user add unique (列名们);d)Alter table user add primary key(列名);主键只能有一个2.建立唯一性索引a)Create unique index on tablename(列名们)3.查看表的索引4.查看索引5.删除索引a)Drop index indexname on tablenameb)Alter table tablename drop index indexnamec)Alter table tablename drop primary key视图1.创建视图2.查询视图3.查看视图数据库实例1.启动实例2.停止实例3.列出当前实例4.列出所有实例配置数据库1.启动mysql服务a)Net start mysql2.创建数据库a)Create database testduan3.删除数据库a)4.连接数据库a)Use duan 使用名为duan的数据库b)Mysql -h 主机地址-u用户名-p密码(连接到远程计算机上的mysql数据库)a)6.中断数据库连接a)7.备份数据库8.还原数据库9.显示当前活动数据库10.生成数据库的定义11.生成定义12.建立别名a)13.查看数据库中的所有表a)Show tables;14.显示当前数据库服务器中的所有数据库列表a)SHOW DATABASES;编目Mysql 查询性能优化之数据类型选择1.char varchar text的选择(原则:最通用的并不是最合适的)a)因为更改数据类型会耗费很长的时候,在定义的时候需要谨慎例如存放密码的MD5加密数据,那么我们就绝对用char(32)因为char使用固定的block,具有更快的偏移速度。

例如存放用户名这样的数据,长的用户名最多也就25位吧,短的也3位以上,相差不大,我们也用char.但如评论这些,就建议用varchar,以免浪费磁盘空间。

一般的评论都不会多于 255个单位字,那些神奇的长评论超出字数让他们分开两贴评论吧。

文章内容建议用text了,因为它很多时候超过255字节了。

虽然,varchar可以去到最大65535字节(注意是字节不是字符,因为它用2字节来表示实际数据的大小)但从内存分配上text比varchar来得要节约.ps:有些引擎不支持text ,如 memory引擎2.varchar(255)和varchar(5)的选择(慷慨不是程序员的美德)a)11620条数据 varchar(10000) 0.03秒测试的结果b)11620条数据 varchar(10) 0.02秒c)在改变数据长度限制是非常轻松的,不会造成长时间耗费或者锁表,因此能小则小,在发现不够用时候再按需要增大,如果想预留冗余,建议在10%内。

对于磁盘来说,varchar(255)和varchar(5)存放‘joffe’数据块占用的大小是一样的,但更大的数据类型大小却带来更大的内存占用。

另外说明一点,这个数字是表示最大字数,不是字节数在utf-8下1就代表3字节,GBK下1就代表2字节3.int(10)与datetime类型的选择(平衡开发速度与机器性能)a)我更倾向于int(10)UNSIGNED,因为它方便。

但对于数据库来说,int(10)占用的空间和内存都比datatime稍微大。

int(10)可以直接存放linux时间戳在php里面直接time()就可以,而且可以根据需求用date()函数格式成任何自己喜欢的输出形式。

不过从数据库的角度,datetime更节约机器资补充说明一下 int(1)和int(11)占用的磁盘空间都是一样的4.尽量NOT NULL (数据不能太空)a)允许null 会在每个数据都加上了1bit的标记,当然1bit我是不在意的,但NULL会令在该列的索引产生一定的变化,特别是char和int这些固定索引因为 null后变成了可变长度索引,这令索引变得复杂,除非是真正要存放NULL 否则都建议非空列.数据类型是char varchar text等用''来做默认而设置Not Null ,int tinyint等用0做默认而设置Not Nullb)Not null: 0.02秒c)Null : 0.02秒;5.用int类型存放IP(看清事实本质类型)a)有些人用varchar(15)来放,这实在是浪费的,IP本来就是整数,32bit的整数 int(10)存放也就不错。

我也见过有人用char(4)存放,把ASCII码全用上了,这种极致的追求也相当不错,不过mysql提供 inet_aton()和inet_ntoa转换ip和int类型,而php也有ip2long和long2ip,从开发角度来说,还是建议用 int(10),另外说一句,char的大小是跟编码有关系,在国内用char(4)反而增大了机器负担。

对比用mysql的inte_aton inet_ntoa,我更建议用php的 ip2long()转换后再存数据库, 取出后用和long2ip()转回IP值得注意的是 X86 系统的PHP里面 ip2long函数有个bug--ip比较大时候会溢出变为负数,解决方法是先转二进制再转回10进--bindec( decbin( ip2long( 'IP地址' ) ) );IP也推荐使用bit(32) not null来模拟,但使用bit时候要非常小心,因为它取出来后是用字符来显示的,而PHP又是弱类型语言,容易导致各种问题.下文有说明.6.char(0) Null 与tinyInt(1)模拟boolen之间争夺(过犹不及,请避免麻烦)a)本来char(0) Null 是模拟boolen最好的,因为只有‘’和NULL两种可能,在机器性能方面达到极致!但可恶的PHP是弱类型,在NULL和'' 之间有很多共通点,一不小心就中招了,在判断方面引来很多麻烦,现在写php的大多是团队合作,某人不中招不代表人人不中。

因此为了避免麻烦还是推荐用tinyInt(1),这个也是mysql推荐的做法。

char(0)Null 这就是单方面追求性能,容易导致开发上的麻烦。

用bit(1) not null 来模拟boolen. 在5.0前bit 跟tinyInt 是一样的, 不过5.0后就不一样的了. bit(1)返回可以是 0 和 1 ,但注意的是 直接 select 返回的是字符类型,而非整数.你存进1 ,取出来显示的并非显示1 而是ASCII 表里面的控制符,没法显示的.这也是会带来麻烦.一般通过+0 操作强制转为整数显示,如 select a+0 as boolen from tb where id=123; b)7.bit 类型的注意事项Mysql 查询性能优化之索引查询索引会大大提高查询的速度,同时却会降低更新表的速度。

因为更新数据时,不仅要保存数据还要保存索引。

建立索引会占用磁盘空间的索引文件。

Mysql 查询性能优化之书写规范Mysql 查询性能优化之关联查询User car1.表关联查询a) 左联接:左联接的意义在于:可以查看所用用户购买车辆的记录,即所有用户的交易记录,如果不用左联接而用的是普通的关联查询的话,查询结果里面不会显示没有交易记录的用户,这 样就失去了查询所有用户的记录的意义了。

b) 右联接:Id Car_name User_id 1 BMW 1 2 CC 2 3AUDI1Id usernaem Parent_id1 Duan 02 Hu 13 Li 24 zhao2右连接的意义在于:可以查看所有交易记录对应的用户,当然,在现实生活中有了用户才可能有交易。

我的理解:左右联接主要看主表,left 就是以左边为主表,right 就是以右边的表为主表,主表中的数据都要显示,在从表中如果没有匹配项,那么从表中的相应值显示为nullc)全联接:d)内联接:内联接的意义在于:两个表都是主表,返回结果是两个表中互相匹配的记录。

e)外联接:外联接就包括左联接、右联接、全链接f)交叉连接:没有where 子句,它返回说有数据行的笛卡尔积。

g)自连接:自连接是指使用表的别名来实现表与自身的连接查询。

h)注释:INNER JOIN 与 JOIN 是相同的。

注释:在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。