作为程序员一定要保持良好的睡眠,才能好编程

mysql数据库安装 命令学习

发布时间:2018-03-07

linux mysql数据库安装


看看linux是如何来安装mysql的



	1. 进入命令行模式:
		yum list | grep mysql
		可以找到mysql的一些安装包,
		通过使用
		yum install -y mysql-server mysql   mysql-devel
					   服务器       客户端   扩展
	    回车,系统自动安装


	    service mysqld start  如果系统是第一次安装,那么会初始化一些数据


	    第二次启动的话,就不会初始化这此数据了.
	    service mysqld restart

	    初始化数据库的密码:  mysqladmin -u root password 'song'
	    					   初始用户名:root 密码:song
	    mysql -u root -p
	    请输入密码:song 回车

	    当出现 mysql> 这样的字符的时候,证明已经登录成功了

	    像这样的服务,我们应该让开机的时候自动开启

	    chkconfig mysqld on   (设置开机自动启动)

	    数据库的配置文件保存在
	    	/etc/my.cnf 这个文件

	    	cat /etc/mycnf 可以打开配置文件,使用vim 命令编辑

	   	 那么我们的数据库文件时保存在什么位置:
	   	 	/var/lib/mysql/
	   	 
	   	 show databases  显示所有数据库

	   	 默认日志:/var/log/mysqld.log

	   	 netstat -tulp 监听端口

	好了,我们安装好mysql以后,可以使用 mysql -u root -p song  来登录mysql服务器

	mysql -h 指定远程服务器IP地址

		 select version();   显示版本号
		 sql语句以;结尾
		 current_date  显示当前时间

		 use databaseName  切换数据库

		 没有直接修改数据库名称的命令。 
	
	【sql结构化查询语言】

		create database  data_test  创建数据库

		drop database data_test 删除数据库

		create table ic_count(
			id int,
			uname varchar(50),
			age int(3),
			address varchar(150)
		);
		创建表

		describe ic_count 显示表的数据结构 也可以使用 desc ic_count 显示结果一样.

		drop table ic_count 


		ALTER 可以使用这个命令修改表的结构

		ALTER TABLE ic_count RENAME count  将 ic_count 表更名为 count

		#向表中添加一列
		ALTER TABLE ic_count ADD tlink varchar(200)   //添加列 tlink 

		#删除一列 DROP COLUMN
		ALTER TABLE ic_count DROP COLUMN tlink

		#修改列的数据类型 MODIFY
		ALTER TABLE  ic_count MODIFY uname varchar(150)

		#重命名列名(把uname 重命名为 username)
		ALTER TABLE ic_count CHANGE COLUMN uname username varchar(100)


		insert into ic_count(column1,column2)VALUES("james","111");   插入数据
		select 
		update  table set column1="" where id=111
		delete from table where id=112


		distinct 去掉结果中的重复项。

		order by  column  desc 倒序 或 asc 正序


		【用户添加删除】
		默认只有一个root用户, 这张表保存在 mysql 数据库 user表中.

		创建一个新用户 IDENTIFIED BY 
		CREATE USER 'xiaosong' INDENTIFIED BY 'song123456'   新创建的用户无法登录,没有权限。

		DROP USER xiaosong 删除用户

		RENAME USER xiaosong TO xiaosong123 把xiaosong 这个用户更名为 xiaosong123

		修改密码:
			SET PASSWORD =PASSWORD("newpass");  修改当前登录的用户名。
			那么如何修改其他用户的密码?
			SET PASSWORD FOR root =PASSWORD("newpass");  修改root用户的密码为newpass

		【mysql权限系统】

			mysql权限控制包含两个阶段:》

				1.检查用户是否能够链接
				   mysql链接认证 
				   GRANT ALL PRIVILEGES ON *.* to 'xiaosong@%' IDENTIFIED BY 'xiaosong123' 
				   'xiaosong@%'
				   1.所有主机'%'
				   2.精确的主机名或IP地址:192.168.1.1

				2.检查用户是否具有所执行动作的权限。

			mysql授予权限可分为:
				1.全局
				2.数据库
				3.表层
				4.列层

		GRANT 授予权限    REVOKE撤销权限

		GRANT ALL PRIVILEGES ON 层级 to 用户@主机 IDENTIFIED BY 密码

		GRANT ALL PRIVILEGES ON *.* to 'xiaosong'@'%' IDENTIFIED BY 'xiaosong123'

		GRANT ALL PRIVILEGES ON mytyrenet.* to 'xiaosong'@'%' IDENTIFIED BY 'xiaosong123'

		REVOKE ALL PRIVILEGES FROM user="xiaosong" 删除用户权限。

		privileges

		grant all privileges on *.* to 'tt'@'%' identified by '111';


		【mysql简单的备份】

		mysqldump -uroot -p 数据库名称 > 备份文件.sql

		mysql -uroot -p 数据库名称 < 备份文件.sql


		【数据库编码】

			1.影响数据库占用空间的大小。
			2.数据库与客户端的通信。

			show character set;  显示所有编码格式

			创建数据库的时候,可以指定编码

			create database lcdb 
			default character_set utf-8
			default collate utf8_general_ci;

			show variables like 'character_set' 查看数据库编码



mysql学习

学习目标
	1.掌握mysql基本知识
	2.学习数据为管理和操作
	3.掌握数据库设计方法
	4.熟练运用sql编程语言

	一、基本概念
		MYSQL 数据库是关系型数据库库
			 关系型:使用一个有关系,把实体信息和实体之间的联系。
			 关系:就是一张二维表,有行有列的表格。

	   关系型数据库:就是由二维表及其之间的联系组成的数据组织。

	  【mysql结构化查询语言】
	     专门用于修理工关系型数据库编程语言。

	     php编程语言(变量、流程控制、函数)
	     当然mysql也是有这些东西的。
	   
	   	数据库服务器的结构
	   		DBS=DBMS+DB

	   		命令行客户端  cmd   mysql

	   	 .frm 表结构
	   	 .myd 数据
	   	 .myi 索引

	   	 同一个表中的数据结构完全一致。



	   	 【操作服务器】

	   	  netstat -an  监听哪些端口

	   	  3306 是mysql默认端口号 


	   	  mysql -uroot -psong 连接到数据库


 【重头戏,sql语言】

 	存储数据:
 	   首先建立数据库、之后建立表。
 	   操作数据

 	   数据有哪些操作?
 	   CURD
 	   CREATE UPDATE READ DELETE(DROP)

 库操作 : database

	show databases 显示数据库
	show databases like '%t%' 模糊查询
	show databases like 't%' 模糊查询
	show databases like '%t' 模糊查询
	通配符:% _
	% 可以匹配所有字符,也可以匹配空字符串。
    _可以匹配任意一个字符,但不包括空字符串。

    数据库命名规则:字母、数字、下划线。
    不使用系统保留字做数据库、表、或字段
    如果数据库名称较长,使用下划线链接,不使用驼峰法。

    查看创建数据库的资料
    show create database myluntai;
    zsservice | CREATE DATABASE `zsservice` /*!40100 DEFAULT CHARACTER SET utf8 */

     if not exists  


     创建数据库 创建了newdata数据库
      create database newdata;
      如果不指定数据库字符集,那么就使用安装时,默认的数据库字符集。

      有四个级别的字符集:
      	服务器集
      	数据库集
      	数据表集
      	字段集

      	所有的配置文件保存在my.ini 这个文件中。

      	create database if not exists newdata; 容错方式,当newdata数据库不存在的时候,创建。

      	create database newdata  default charset=gbk; 指定字符集创建数据库

      	修改数据库: alert database 数据库名 选项

      	找到数据库的 db.opt 保存着编码格式。

      	alter database newdata charset=utf8
      	把newdata这个数据库编码修改为utf8

      	删除数据库:
      		drop database  库名

      		drop database if exists newdata


     【创建表】

     show create table student\G
     显示出如何创建的此表的sql语句。

     desc student 显示表的数据结构
     show columns from student 也是显示表结构

     修改表
     	alter table 表名 modify



     #复制表结构,表中没有任何数据
     create table student_copy like student

     #复制表,并把数据也复制过去。
     create table student_copy select * from student

     重命名表,使用rename 命令
      rename table student_info to student2



      mysql学习第二天
      数字可以不加引号,但加也没有问题

      create table student(
      	student_id int,
      	student_name varchar(20),
      	class_name varchar(20),
      	area varchar(10)
      	);

      insert into student(
      	student_id,student_name,class_name,area
      	)values(
      	1,"james","101班","北京"
      	);

      	insert into student(
      						student_id,
      						student_name,
      						class_name,
      						area
      				)values(
      						1,
      						"james",
      						"101班",
      						"北京"
      	);

      使用select从其他表调整数据:

      如果表的结构或表对应的字段类型完全一致,这时候就可以写
      insert into 表名 select * from 其他表 where ...order by .. limit..
      	如果不一样的时候,可以使用下面方式来做:类型必须对应起来。
      	insert into student2(student_id,studnet_name) select id,name from student_2;

      替换数据 replace into

      	和 insert into 方法一样,只是把insert改成了replace

      	和 insert into 的区别:

      	insert into 是直接插入,而replace into 是先判断表中的主键或唯一键字段是否和插入的数据相对应的字段一样的数据,
      		那么就变成修改(先删除一行再插入一行)
      		如果不一样,则直接插入。


      	如果插入的数据表,没有任何主键和唯一键,那么 replace into 则不判断,直接插入。

      	只要是主键或唯一键有重复的就删除,然后重新把这条新数据插入进去。

      	replace into 有时候会影响多条数据,如果有重复的数据是先删除再插入。
      	replace into 并不等同于 update。

      	【select 查询数据】

      	select * from student;

      	delete from student where id>5 order by id desc limit 1;

      	快速删除所有数据:truncate

      	格式:truncate 表名 <==> delete from 表名

      	truncate student; 

      	有什么区别:
      		1. truncate 先把表删除,然后再重建,优点速度快。
      		2. 不会返回受影响的行数。
      		3. Auto_increment 自动增量会恢复初值。



    【乱码问题】

     我们查看一下关于编码的变量:

     show variables like 'character_set%';

     character_set_client 客户端使用的编码
     character_set_connection 数据库使用的编码
     character_set_results  返回结果使用的编码

     这三个变量的设置影响到数据是否是乱码

     set character_set_results=gbk; 设置客户端编码为gbk

     设置character_set_results为客户端一致的编码。


     我们插入数据会不会有问题呢?

     	会有问题

     原因是什么?
     就是客户端编码问题,
     	明明是gbk的编码,确告诉数据库是utf8,转码出现问题


     	set character_set_client=gbk


     	mysql> show variables like 'character_set%';
		+--------------------------+----------------------------+
		| Variable_name            | Value                      |
		+--------------------------+----------------------------+
		| character_set_client     | latin1                     |
		| character_set_connection | latin1                     |
		| character_set_database   | utf8                       |
		| character_set_filesystem | binary                     |
		| character_set_results    | latin1                     |
		| character_set_server     | latin1                     |
		| character_set_system     | utf8                       |
		| character_sets_dir       | /usr/share/mysql/charsets/ |
		+--------------------------+----------------------------+

		使用 set names utf8; 重置编码

		mysql> set names utf8;
			Query OK, 0 rows affected (0.00 sec)

			mysql> show variables like 'character_set%';
			+--------------------------+----------------------------+
			| Variable_name            | Value                      |
			+--------------------------+----------------------------+
			| character_set_client     | utf8                       |
			| character_set_connection | utf8                       |
			| character_set_database   | utf8                       |
			| character_set_filesystem | binary                     |
			| character_set_results    | utf8                       |
			| character_set_server     | latin1                     |
			| character_set_system     | utf8                       |
			| character_sets_dir       | /usr/share/mysql/charsets/ |
			+--------------------------+----------------------------+
			8 rows in set (0.00 sec)

	关于乱码总结:
		1.首先我们要确认我们的客户端是什么编码,命令行客户端看属性,php文件看编码
		2.根据客户端编码,使用set names gbk 或 utf8 设置编码。
    
	【mysql学习第三天】
    
	default value	默认值
	
	auto_increment	自动增量

	primary key	主键 

	Primary key = not null + unique 主键 

	Auto_increment:自动增量 只能用于任何一种整数型作为主键时的属性


    unsigned auto_increment primary key

    unsigned 代表正小数。
    浮点数:float 小数后不精确。        
    定点:严格浮点数 decimal(M,D)
    	  decimal(15,6); 
    	  前边有效位数,后边小数位数. 
    小数点后面保存6位小数,如果不足,就以0补齐,保证6位小数
    float 会出现近似值。

    decimal 定点,不管数是多少,是多少存多小不会进位,不会出现近似值。

	字符串类型
		char(L) 定长字符 L 代表字符长度,小于等于255
		create table cc(
			c1 char(1)
			);
		insert into cc values('a');
		insert into cc values('ab'); 如果超出长度,则系统会报错(即便没有报错,也是有一个警告,超长的部分系统会自动截取)。不能插入超出长度的字符串。
		insert into cc values('陈'); 也可以插入。
		select * from cc;	
		mysql 定义的长度是字符数,不是字节数。1个中文=1个字母的长度.

		varchar(L)
			L<65535 具体大小和编码有关。
			L是几,就能存几个汉字或字母。
			建议:长度大于255时,就用text类型。

			1个utf8编码汉字占3个字节,因此长度大约为65535的3分之1.

			1个gkb编码汉字占2个字节,因此长度约为65535的2分之1。

		同样可知:
			char utf8编码长度必须是小于255/3-1
				 GBK编码长度必须是小于255/2-1 

		Text 大文本类型

			tinytext <255 字节
			text <65535 字节
			mediumtext 最多可存储2^24-1字节
			Longtext 最多可存储2^32-1字节

		Blob 二进制大对象类型 和text类型类似。
			区别就是,它是用于保存二进制内容的。
				保存图片、文件、二进制内容

		Enum 枚举类型
			特殊的字符串类型,用于保存单选类型。

			create table enum_attr(
			  gender enum("boy","girl")
			);

			insert into enum_attr(gender) values("boy");
			insert into enum_attr(gender) values("boy222");
			插入枚举之外的数据会报错。
			枚举类型字段有 null not null 这两个字段。
			枚举可以使用索引来代替枚举,
			例如:1 ->boy
				  2 ->girl
			 不建议:不要用数值,比如: gender enum('0','1','2');

			 select * from enum_attr where gender=1; 查出结果 是枚举的值。

			 set 集合
			 set最多成员是64个。

			 find_in_set(字段类型,要查询的值);

			 create table set_attr(
			  xiai set("boy","girl")
			);
			 \
		Date 类型:

			YYYY-MM-DD
			取值范围:1000-01-01 到 9999-12-31
			如果想设置为空,可以使用 0000-00-00 比较好

		Time 时间类型
			HH:MM:SS

		Year 年类型
		取值范围: 1901-2155

		Timestamp 时间戳类型
			和php的时间戳不一样,php是一个整数类型的,而mysql是一个时间类型的字符串。

	 【mysql学习第四天 设计范式 NF NormalFormat】

	 	如果满足了设计范式的要求,数据库就会简洁,结构清晰,反之,会出现数据冗余、还会有插入、删除、更新数据有异常。

	 	设计范式我们通常使用三种: 1NF 2NF 3NF 也叫第一范式,第二范式,第三范式

	 	1NF 是最宽松的。  第三范式是最严格的。如果设计数据库已经满足了第三范式,那么肯定已经满足了前两个范式。

	 	.第一范式 1NF ,字段的原子性
	 		保证每一列的数据不可再分。保证字段的原子性。

	 	.第二范式 2NF  消除部分依赖


	 	.第三范式 3NF  消除传递依赖

	 		外键 关联到 其他表的主键

	 	实体间的联系:	 	
	 			

mysql 复习

查    select
       where 表达式  (哪一行符合要求,就显示出来)
       	=,!=,  <>,>,<,
       	in,not in ,between and,
       	or,and,not
       group by
       	聚合函数
       	    max,min,avg,sum,count
       having
       	对查询出来的结果,再次过滤。使用方法和where一致。
       	查询出来的结果,我们可以看成一张临时表,他是存在于缓冲区。
       order by 
       	对升序和降序有作用  , asc  desc
       	使用案例:order by field1 asc,field2 desc
       limit   
       	限制条目
       	limit offset ,N
       	offset是偏移量。

子查询 
	where 型子查询
	select * from goods where goods_id=(select max(goods_id) from goods);

	from 型子查询
	把内层的查询结果 供外层再次查询

	exists 型子查询
	select * from category where exists(select * from goods where cat_id =category.cat_id);


union 合并查询结果 
	select * from
连接查询
	左连接
	右连接
	内连接

select  A.*
       A left join B 
   on   条件
   where 1;

create table boy(
       name char(3),
       flower char(5)
) charset utf8;

create table girl(
       name char(3),
       flower char(5)
) charset utf8;
创建表,并指定字符集。

insert into boy(name,flower)values('小','玫瑰'),('','');
这样的语句可以插入多条内容。

select boy.*,girl.* from boy left girl on boy.flower=girl.flower;
左连接
       以左边为准,去右表匹配数据,如果右边找不到,则以null补齐。
       但不知道具体多少行,但至少大于左边的总数。
右连接
       不管以左连接,还是以右连接,都是以左表为准。

如何记忆:
       1.左右连接可以相互转换
       2.推荐使用左连接使用。

什么是内连接:查询左右表都有的数据。

select boy.*,girl.* from boy as b,girl as g where b.flower =g.flower;

select boy.*,girl.* from boy inner join girl on boy.flower=girl.flower;

在ecshop这个数据库中,查找到goodid 

左连接和右连接都是可以连接多个表的。
例如
       select boy.*,girl.*
       from 
              boy left join girl 
       on    
              boy.flower=girl.flower
       #在这里可以直接把上面的做为一张表,直接来使用。
       left join classname       #左连接到classname这张表
       on
              classname.name=;

charset utf8  
variables like 'character_set%';  #显示此数据库的一些编码信息。

使用别名的时候,不要用 having  否则会报错
使用左右查询的时候,记得用起别名的方式来做,以免和其他的表起冲突。

mysql视图 view

       查询goodid 最贵
       查询结果可以当成一张表来看,如果某个查询结果出现的非常频繁。
       create table t2  like goods
       create table t2 select ...... 这样就是建立了一张表。

       把查询结果存起来,但是你建立了一张表,则不是实时更新啊。所以建立视图,实时更新。
       视图是由查询结果形成的一张虚拟表。
       视图的创建语法 :
                            create view  viewt as select 语句
                            select 查询结果,把这个结果保存到视图中去。
                            创建完毕后,可以使用 show tables ; 来查看表,看看是否有视图
                            select * from viewt; 即可显示出视图的内容。
       视图删除:
                     drop view viewt; 删除 viewt 这个视图。
       为什么会用视图?
                            可以简化查询
                            可以进行权限控制,开发相应的视图权限。
                            大数据分表时,可以用到。
                                 可以把一张表的数据拆分成4张表来存放。
                                 分散的方法有很多种:那我们来看一种方式 :
                                  ID取模来计算。
                                  $tablenum=ID%4+1=[1,2,3,4] 

                                  查询的时候,
                                   $sql="select * from news".$tablenum." where id=ID";

                                   凡是有返回结果的sql语句,均可以建立视图,在大数据量的时候,可以发挥一定的作用。
       视图修改:
              alter view  as select ..... 相当于删除了旧的视图然后重建立了一个视图。

       视图与表的关系是什么呢?
              归根到底,视图的数据来源于表,那么表的数据修改后,视图的数据肯定也会发生变化。
              那么我在表中新增一个呢?视图会变吗?

       视图改变了,表的数据会变吗?  
              1.视图并不是总能增删改的
              2.视图的修改也能影响表。
              什么时间的视图可以修改呢? 当视图中的数据与表中的数据一一对应的时候,可以修改。


       group  by  是放在 order by 语句的前面。

       create view algorithm=temptable viewName as select 

       创建视图默认是merg的,当我们在这个种模式下的视图下查询结果的时候,会把两个where语句叠加起来,

       而如果我们指定了algorithm  这个属性为 temptable 的时候,会临时创建一张表,供我们使用。

       触发器 trigger 
       
       什么是触发器? 
          监视某种情况并触发某种操作。
              
              触发器可以监视哪三种操作呢?  增、删、改
              触发器操作:增、删、改

              监视哪张表,操作哪张表?
              监视order表的insert ,来操作goods的update方法

              table  触发地点
              
              after/before 触发时间 

              如何创建触发器?

              create table g(
                     id int,
                     name varchar(30),
                     num int
                     )charset utf8;
              
              create table o(
                     oid int,
                     gid int,
                     much int
                     )charset utf8;

              insert into g values(
                     1,'猪',22),(2,'猫',33),(3,'兔',16),(4,'羊',13);

             create trigger triggerName
             after/before insert/update/delete on 表名
             for each row #固定写死的
             begin

                 sql语句 
             end

             重新命名以 $ 为结束符
             delimiter $
             create trigger tg1
             after insert on on
             for each row #固定写死的
             begin
                 update g set num=num-3 where id=2;

             end$

             等这个窗口命令结束后,再执行一下 delimiter ;


             修改delimiter $


             #如何修改购买二头猪,羊

             在触发器中引用行的值
             对于insert而言,新插入的行叫new 
             那么它的字段叫什么呢? new.field  这样就可以了。  new.字段名 可以访问到值

             delimiter $

             #增加  new 
             create trigger tg1 #添加订单、库存减少
             after insert on 
             for each row #固定写死的
             begin
                 update g set num=num-new.much where id=new.gid;
             end$


             #删除 old
             create trigger tg2
              after delete on o
              for each row
              begin
                     update g set num=num+old.much  where id=old.gid;
              end$

             #更新 update
               对于update来说,没有修改之前我们可以用old来表示,修改之后,可以用new来表示

               create trigger tg3
               after update on o
               for each row
               begin
                 update g set num=num+old.much where id =old.gid;
                 update g set num=num-new.much where id=new.gid;
               end$

               触发器中的after 和before 的区别

               after是先完成增删改,然后再触发

               before 是先完成触发,再增删改
                          如果是恶意触发,我们有机会可以修改。

              带有判断的触发器
              create trigger tg5
              before insert on o
              for each row
              begin
               if new.much>5 then
                     set new.much=5;
               end if 
               update g set num=num-new.much where id=new.gid;
               end$

              如何查看触发器
              show trigger;




              mysql事务
                 什么是事务? 一组操作,要么都执行,要么都失败

                 事务的特性:必须是全部都要成功,只有一个执行失败,事务回滚
                                     事务发生前和发生后,数据的总额是匹配的。
                                     事务产生的结果是不能撤销的--
                事务的四大特性
                       隔离性
                       持久性
                       一致性
                       原子性

                 如何开启事务?

                 要开启事务,表的引擎必须是innodb
                 start transaction #开启了事务

                 update account set money=money+500 where id =2;
                 update account set money=money-500 where id =1;

                 commit / rollback; 
                 如果两条语句都执行成功了,commit 提交这两个操作
                 rollback 取消上面的两个操作。 


                 create table account(
                     id int(4),
                     name char(20),
                     money float(7,2)
                ) engine=InnoDB charset=utf8;

              如果创建的过程中出现:
              ERROR 1289 (HY000): The 'InnoDB' feature is disabled; you need MySQL built with
                                  'InnoDB' to have it working
              解决方法:
               找到mysql的安装目录,打开 my.ini 找到
               skip-innodb 在前面加上 # 
               注释掉。重新启动mysql数据库,即可创建成功
               net stop MySQL 关闭mysql数据库
               net start MySQL 重新启动mysql数据库


              存储引擎
              数据库以哪种方式来存储?engine myisam
              创建表的时候,指定表的引擎?
              innodb    安全高、支持事务、行锁、全文索引
              myisam  安全低速度快、不支持事务、表锁、全文索引


存储过程
  概念类似于函数,就是把一段代码封装起来

  if/else  case,while
  
  可以进行sql编程

  show procedure status \G
  
  delimiter $
  create procedure p1()
  begin
    select * from g;
  end$   

  调用方法:
    call p1();

  create procedure p2(n int)
  begin
    select * from g where num<n;
  end$

  create procedure p3(n int ,t char)
  begin
    if t='h' then
      select * from g where num>n;
    else
      select * from g where num<n;
    end if;
  end$



  和自定义函数差不多
  create function f1()
  begin
   declare i int;
   set i=0;
   return i; 
  end$


  声明i 为int变量
   declare i int;


  备份与恢复

    mysqldump 备份工具

    mysqldump -uroot -psong mydatabase tablename d:\\tablename.sql


    mysqldump -uroot -psong mydatabase D:\\mydatabase.sql

    以库为单位
    mysqldump -uroot -psong -B mydatabase1 mydatabase2 D:\\mydatabase.sql

    导出所有的库
    mysqldump -uroot -psong -A D:\\all.sql


    使用 source 读取备份的文件。还原数据库

    索引的使用:加快查询速度
                坏处:降低了增删除改的速度。

      不要过度索引



      索引分类:
        普通索引 :index 加快查询速度
        唯一索引 :unique 行上的值不能重复
        主键索引 :primary key 不能重复
                    一张表只能有一个主键索引,可以有一个或多个唯一索引
        全文索引 : fulltext


        查看某张表的索引:

        show index from 表名 
        show index from 表名 \G

        建立索引:

        alter table  表名 add [index|unique|primary key|fulltext] 索引名 (列名);

        alter table 表名 drop index 索引名 删除一个索引 

        alter table goods add index username (username)  # 在username这个字段上,添加username索引,以加快查询速度。
        alter table goods drop index username 删除username这个索引。

        alter table goods add primary key (id)
        alter table goods drop primary key

        全文索引: 不支持中文

        例如 500W数据,如何快速导入
            1.先把索引全部删除
            2.集中再建立索引。
       


          php程序员如何来完成商城预定商品生成订单的操作呢?


       什么是事务?