Python-day(十二)-MySQL

一、数据库介绍

  什么是数据库?

    数据是按照数据结构组织、存储和管理数据的仓库
    每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。
    我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。
    所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理的大数据量,所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
    RDBMS即关系数据库的管理系统(Relational Databases Management System)的特点:
        1、数据以表格的形式出现
        2、每行为各种记录名称
        3、每列为记录名称所对应的数据域
        4、许多的行和列组成一张表单。
        5、若干的表单组成database。

  RDBMS 术语

        在我们开始学习MySQL数据库前,让我们先了解下RDBMS的一些术语:
            数据库:数据库是一些关联表的集合。
            数据表:表示数据的矩阵,在一个数据库中的表看起来像一个简单的电子表格。
            列:一列(数据元素)包含了相同的数据,例如邮政编码的数据。
            行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
            冗余:存储两倍说句,冗余可以使系统速度更快(表的规范化程度越高,表与表之间的关系就越多;查询时可能经常需要在多个表之间进行连接查询,而进行连接操作会降低查询速度,例如,学生的信息存储在student表中,院系信息存储在department表中,通过student表中的dept_id字段与department表建立关联关系。如果要查询一个学生所在系的名称,必须从student表中查询学生所在院系的编号(dept_id),然后根据这个编号去department查找系的名称,如果经常需要进行这个操作时,连接查询会浪费很多的时间,因此可以在student表中增加一个冗余字段dept_name,该字段用来存储学生所在院系的名称,这样就不用每次都进行连接操作了。)
            主键:主键是唯一的,一个数据表中只能包含一个主键,你可以使用主键来查询数据
            外键:外键用于关联两个表。
            复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
            索引:使用索引可快速访问数据库表中的特定信息,索引是对数据库表中一列或多列的值进行排序的一种结构,类似于书籍的目录。
            参照完整性:参照的完整性要求关系中不允许引用不存在的实体,与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

  MySQL数据库

        MySQL是最流行的关系型数据库管理系统,在web应用方面MySQL是最好的RDBMS应用软件之一,MySQL是一种关系型数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库中,这样就增加了速度并提高了灵活性。
            MySQL是开源的,所以你不需要支付额外的费用。
            MySQL支持大型的数据库,可以处理拥有上千万条记录的大型数据库。
            MySQL使用标准的SQL数据语言形式。
            MySQL可以允许于多个系统上,并且支持多种语言,这些编程语言包括C、C++、Python、java、perl、PHP、eiffel、ruby和tcl等。
            MySQL对PHP有很好的支持,PHP是目前最流行的web开发语言。
            MySQL支持大型数据库,支持5000万条记录的数据仓库。32位系统表文件最大可支持4GB,64为操作系统最大的表文件为8TB。
            MySQL是可以定制,采用了GPL协议,你可以修改源码来开发自己的MySQL系统。          

二、MySQL数据的安装使用

Linux/Unix上安装MySQL

    Linux平台上推荐使用rpm包来安装MySQL,MySQL AB提供了以下RPM包的下载地址。
        MySQL-MySQL服务器。你需要该选项,除非你只想连接运行在另一台机器上的MySQL的服务器。
        MySQL-client MySQL客户端程序,用于连接并操作MySQL服务器。
        mysql-devel-库和包含文件,如果你想要编译其它mysql客户端,例如perl模块,则需要安装该RPM包。
        MySQL-shared-该软件包包含某些语言和应用程序需要动态状态的共享库(libmysqlclient.so*),使用MySQL。
        MySQL-bench-MySQL数据库服务器的基准和性能测试工具。
        
    以下安装MySQL RMP的实例是在SuSE Linux系统上进行,当然该安装步骤也适合应用于其他支持RPM的Linux系统,如:CentOS。

2.1 MySQL简单操作       

    通过以下命令执行Mysql安装,rpm包为你下载的rpm包:
        
        [root@host]# rpm -i MySQL-5.0.9-0.i386.rpm
        
    以上安装mysql服务器的过程会创建mysql用户,并创建一个mysql配置文件my.cnf。
        
    你可以在/usr/bin和/usr/sbin中找到所有与MySQL相关的二进制文件。所有数据表和数据库将在/var/lib/mysql目录中创建。
        
    以下是一些mysql可选包的安装过程,你可以根据自己的需要来安装:
        [root@host]# rpm -i MySQL-client-5.0.9-0.i386.rpm
        [root@host]# rpm -i MySQL-devel-5.0.9-0.i386.rpm
        [root@host]# rpm -i MySQL-shared-5.0.9-0.i386.rpm
        [root@host]# rpm -i MySQL-bench-5.0.9-0.i386.rpm 

  使用 MySQL Client(Mysql客户端) 执行简单的SQL命令

        你可以在 MySQL Client(Mysql客户端) 使用 mysql 命令连接到Mysql服务器上,默认情况下Mysql服务器的密码为空,所以本实例不需要输入密码。
        
        命令如下:

 [root@host]# mysql

        以上命令执行后会输出 mysql>提示符,这说明你已经成功连接到Mysql服务器上,你可以在 mysql> 提示符执行SQL命令:

        mysql> SHOW DATABASES;
        +----------+
        | Database |
        +----------+
        | mysql    |
        | test     |
        +----------+
        2 rows in set (0.13 sec)

        Mysql安装后需要做的
        
        Mysql安装成功后,默认的root用户密码为空,你可以使用以下命令来创建root用户的密码:
            
        [root@host]# mysqladmin -u root password "new_password";
        
        现在你可以通过以下命令来连接到Mysql服务器:
            
        [root@host]# mysql -u root -p
        Enter password:*******
        
        注意:在输入密码时,密码是不会显示了,你正确输入即可。
        Linux系统启动时启动 MySQL
        
        如果你需要在Linux系统启动时启动 MySQL 服务器,你需要在 /etc/rc.local 文件中添加以下命令:
            
        /etc/init.d/mysqld start

        同样,你需要将 mysqld 二进制文件添加到 /etc/init.d/ 目录中。

三、MySQL管理      

3.1 启动及关闭MySQL服务器

        首先,我们需要通过以下命令来检查MySQL服务器是否启动:
    
        ps -ef | grep mysqld
        
        如果MySql已经启动,以上命令将输出mysql进程列表, 如果mysql未启动,你可以使用以下命令来启动mysql服务器:
            
        root@host# cd /usr/bin
        ./mysqld_safe &
        
        如果你想关闭目前运行的 MySQL 服务器, 你可以执行以下命令:
            
        root@host# cd /usr/bin
        ./mysqladmin -u root -p shutdown
        Enter password: ******

3.2 MySQL用户设置

       

如果你需要添加 MySQL 用户,你只需要在 mysql 数据库中的 user 表添加新用户即可。
        
        以下为添加用户的的实例,用户名为guest,密码为guest123,并授权用户可进行 SELECT, INSERT 和 UPDATE操作权限:
        
        root@host# mysql -u root -p
        Enter password:*******
        mysql> use mysql;
        Database changed
         
        mysql> INSERT INTO user
                  (host, user, password,
                   select_priv, insert_priv, update_priv)
                   VALUES ('localhost', 'guest',
                   PASSWORD('guest123'), 'Y', 'Y', 'Y');
        Query OK, 1 row affected (0.20 sec)
         
        mysql> FLUSH PRIVILEGES;
        Query OK, 1 row affected (0.01 sec)
         
        mysql> SELECT host, user, password FROM user WHERE user = 'guest';
        +-----------+---------+------------------+
        | host      | user    | password         |
        +-----------+---------+------------------+
        | localhost | guest | 6f8c114b58f2ce9e |
        +-----------+---------+------------------+
        1 row in set (0.00 sec)
        
        在添加用户时,请注意使用MySQL提供的 PASSWORD() 函数来对密码进行加密。 你可以在以上实例看到用户密码加密后为: 6f8c114b58f2ce9e.
        
        注意:在 MySQL5.7 中 user 表的 password 已换成了authentication_string。
        
        注意:在注意需要执行 FLUSH PRIVILEGES 语句。 这个命令执行后会重新载入授权表。
        
        如果你不使用该命令,你就无法使用新创建的用户来连接mysql服务器,除非你重启mysql服务器。
        
        你可以在创建用户时,为用户指定权限,在对应的权限列中,在插入语句中设置为 'Y' 即可,用户权限列表如下:
        
        Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Reload_priv,Shutdown_priv,Process_priv,File_priv,Grant_priv,References_priv,Index_priv,Alter_priv
        
        另外一种添加用户的方法为通过SQL的 GRANT 命令,你下命令会给指定数据库TUTORIALS添加用户 zara ,密码为 zara123 。
            
        root@host# mysql -u root -p password;
        Enter password:*******
        mysql> use mysql;
        Database changed
         
        mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
            -> ON TUTORIALS.*
            -> TO 'zara'@'localhost'
            -> IDENTIFIED BY 'zara123';

3.3 管理MySQL的命令

        MySQL数据过程中常用的命令:
            use databasename:选择要操作的MySQL数据库,使用该命令后所有mysql命令都只针对该数据库。
            show databases:查看数据库
            show tables:查看数据表
            show columns from 数据表:显示数据表的属性,属性类型,主键信息,是否为null,默认值等其他信息。
            create database testdb charset "utf8":创建数据库
            drop database testdb,删除数据库。
            show index from 数据表:显示数据表的详细索引信息,包括主键(primary key)
            grant :用户授权
            flush privileges:刷新权限。

3.4 MySQL数据类型

        MySQL中定义数据字段的类型对你数据库的优化是非常重要。
        MySQL支持多种类型,大致可以分为三类:数值、日期/时间和字符串(字符)类型。
        
        数值类型
            MySQL支持所有标准sql数值数据类型。
            这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。
            关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
            BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。
            作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。          

3.5 mysql常用命令

  MySQL创建数据表

            语法
                CREATE TABLE table_name (column_name column_type);
            创建一个student表
            mysql> create table student(
                -> id int not null auto_increment,
                -> name char(32) not null,
                -> age int not null,
                -> register_date date,
                -> primary key (id)
                -> );
            实例解析:
                如果你不想字段NULL可以设置字段的属性为NOT NUll,在操作数据库时如果输入该字段的数据为NUll,就会报错。
                AUTO_INCREMENT自定义列为自增的属性,一般用于主键,数值会自动加1.
                PRIMARY KEY 关键字用于定义列为主键,你可以使用多列来定义主键,列间以逗号分隔。
                   

  MySQL插入数据

            语法:
                INSERT INTO table_name ( field1, field2,...fieldN )
                                        VALUES
                                        ( value1, value2,...valueN );
            插入数据
                insert into student (name,age,register_date) values ("陈鑫",22,"2016-02-03");
                mysql> select * from student;
                +----+--------+-----+---------------+
                | id | name   | age | register_date |
                +----+--------+-----+---------------+
                |  1 | 陈鑫 |  22 | 2016-02-03    |
                +----+--------+-----+---------------+
                1 row in set (0.00 sec)      

  MySQL查询数据

            语法: SELECT column_name,column_name
                    FROM table_name
                    [WHERE Clause]
                    [OFFSET M ][LIMIT N]
                查询语句中你可以时候用一个或多个表,表之间使用逗号(,)分割,并使用where语句来设定查询条件。
                select 命令可以读取一条或多条记录。
                你可以使用星号(*)来代替其他字段,select语句会返回表的所有字段数据。
                你可以通过offset指定select语句开始查询的数据偏移量,默认情况下偏移量为0.
                你可以使用limit属性来设定返回的记录数。
            查询数据
                mysql> select * from student limit 3 offset 2;
                +----+-----------+-----+---------------+
                | id | name      | age | register_date |
                +----+-----------+-----+---------------+
                |  3 | 刘强    |  53 | 2016-04-30    |
                |  4 | 白弘毅 |  31 | 2016-11-21    |
                |  5 | 汤中山 |  21 | 2016-12-20    |
                +----+-----------+-----+---------------+
                3 rows in set (0.00 sec)
                #从第二行开始向下查询3条数据,limit后面跟的是3条数据,offset后面是从第2行开始读取。
                mysql> select * from student limit 3,1;
                +----+-----------+-----+---------------+
                | id | name      | age | register_date |
                +----+-----------+-----+---------------+
                |  4 | 白弘毅 |  31 | 2016-11-21    |
                +----+-----------+-----+---------------+
                1 row in set (0.00 sec)
                #这个sql是,limit后面是从第3条开始读,读取1条信息。  

  MySQL where 子句

            语法:
                SELECT field1, field2,...fieldN FROM table_name1, table_name2...
                [WHERE condition1 [AND [OR]] condition2.....
            以下为操作符列表,可用于where子句中
                下表中实例假定 A为10 B为20
                操作符          描述                                                                                                实例
                =               等号,检测两个值是否相等,如果相等返回true                                                                (A = B) 返回false。
              <>,!=           不等于,检测两个值是否相等,如果不相等返回true                                                             (A != B) 返回 true。
                >               大于号,检测左边的值是否大于右边的值, 如果左边的值大于右边的值返回true                                      (A > B) 返回false。
                <               小于号,检测左边的值是否小于右边的值, 如果左边的值小于右边的值返回true                                      (A < B) 返回 true。
                >=              大于等于号,检测左边的值是否大于或等于右边的值, 如果左边的值大于或等于右边的值返回true                            (A >= B) 返回false。
               <=              小于等于号,检测左边的值是否小于于或等于右边的值, 如果左边的值小于或等于右边的值返回true                          (A <= B) 返回 true。
        
            
            使用主键来作为 where 子句的条件查询是非常快速的。
            mysql> select * from student where register_date >"2016-08-31";    

  MySQL update 语句

            语法:
                UPDATE table_name SET field1=new-value1, field2=new-value2
                [WHERE Clause]
            
                 update student set age=22,name=="chenxin" where id =1;                 

  MySQL delete语句          

语法:
                DELETE FROM table_name [WHERE Clause]
                
                delete from student where id=5;       

  MySQL like 子句

           

语法:
                SELECT field1, field2,...fieldN table_name1, table_name2...
                WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
                
                select * from student where name like "%Li";#不区分大小写匹配
                select * from student where name like binary "%li";#区分大小写匹配                     

  MySQL排序

           

语法:
                SELECT field1, field2,...fieldN table_name1, table_name2...
                ORDER BY field1, [field2...] [ASC [DESC]]
              使用ASC或DESC关键字来设置查询结果是按升序或降序排列,默认情况下,它是按升序排序。
                
                select * from student where name like binary "%li" order by id desc; #desc是降序排序,按照id进行排序
                select * from student where name like "%li" order by id;#默认按照升序排序。         

  MySQL group by 语句

            SELECT column_name, function(column_name)
            FROM table_name
            WHERE column_name operator value
            GROUP BY column_name;
                
            mysql> select * from student;
            +----+-----------+-----+---------------+
            | id | name      | age | register_date |
            +----+-----------+-----+---------------+
            |  1 | chenxin   |  22 | 2016-02-03    |
            |  2 | 沁夫    |  33 | 2016-06-08    |
            |  3 | 刘强    |  53 | 2016-04-30    |
            |  4 | 白弘毅 |  31 | 2016-11-21    |
            |  6 | alex li   |  18 | 2016-11-11    |
            |  7 | alex Li   |  33 | 2015-11-11    |
            +----+-----------+-----+---------------+
            6 rows in set (0.01 sec)
             接下来我们使用 group by 语句,将数据表按名字进行分组,并统计每个人有多少条记录;
             mysql> select name,count(*) from student group by name;
            +-----------+----------+
            | name      | count(*) |
            +-----------+----------+
            | alex li   |        2 |
            | chenxin   |        1 |
            | 白弘毅 |        1 |
            | 刘强    |        1 |
            | 沁夫    |        1 |
            +-----------+----------+
            5 rows in set (0.00 sec)
            使用with rollup,#将相同name的条数的年龄相加起来,在求和。
            mysql> select name,sum(age)as age_count from student group by name with rollup;
            +-----------+-----------+
            | name      | age_count |
            +-----------+-----------+
            | alex li   |        51 |
            | chenxin   |        22 |
            | 白弘毅 |        31 |
            | 刘强    |        53 |
            | 沁夫    |        33 |
            | NULL      |       190 |
            +-----------+-----------+
            6 rows in set (0.00 sec)
            其中记录NULL表示所有人的年龄之和。
            我们是使用coalesce来设置一个取代null的名称,coalesce语法:
            mysql> select coalesce(name,'总数'),sum(age) as age_count from student group by name with rollup;
            +-------------------------+-----------+
            | coalesce(name,'总数') | age_count |
            +-------------------------+-----------+
            | alex li                 |        51 |
            | chenxin                 |        22 |
            | 白弘毅               |        31 |
            | 刘强                  |        53 |
            | 沁夫                  |        33 |
            | 总数                  |       190 |
            +-------------------------+-----------+
            6 rows in set (0.00 sec)
            

  MySQL alter 命令       

           

我们需要修改数据库表名或者修改数据表字段时,就需要使用到MySQL alter命令。
            删除,添加或修改表字段
                alter table student drop register_date; #从student表删除register_date字段。
                alter table student add phone int(11) not null; #在student表中添加phone字段。
            修改字段类型及名称
                如果需要修改字段类型及名称,你可以在alter命令中使用modify或change子句。
                
                例如,把字段name的类型从char(32)改为char(40),命令为:
                    alter table student modify name char(40);
                使用change子句,语法有很大不一样,在change关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型,尝试如下实例。
                    alter table student change phone iphone bigint;#修改名字并改变字段类型
                    alter table student change iphone iphone int;#只修改字段类型,但必须要加修改的名字和修改成的名字。
            alter table 对NUll值和默认值的影响
                当你修改字段时,你可以指定是否包含只或者是否设置默认值。
                以下实例,指定字段iphone为not null 且默认值为100
                 alter table student modify iphone bigint not null default 100;
                 #注意:这里修改的默认值是在此以后新添加的会有默认值,之前的数据是不会修改的。
            修改表名
                alter table student rename to alter_tb1;

  MySQL关于主键

        

   外键,一个特殊的索引,用于关键2个表,只能是指定的内容。
            mysql> create table class(
                -> id int not null primary key,
                -> name char(16));
            Query OK, 0 rows affected (0.00 sec)
            
            mysql> create table student2(
                -> id int not null,
                -> name char(16) not null,
                -> class_id int not null,
                -> primary key (id),
                -> key fk_class_key (class_id),
                -> constraint fk_class_key foreign key (class_id) references class (id)
                -> );
            Query OK, 0 rows affected (0.00 sec)
            此时如果class表中不存在id 1,student表也插入不了,这就叫外键约束。
            mysql> insert into student2(id,name,class_id) values(1,'alex', 1);
            ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`testdb`.`student2`, CONSTRAINT `fk_class_key` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))
             
             
             
            mysql> insert into class(id,name) values(1,"linux");
            Query OK, 1 row affected (0.01 sec)
             
            mysql> insert into student2(id,name,class_id) values(1,'alex', 1);
            Query OK, 1 row affected (0.00 sec)
             
             
            #如果有student表中跟这个class表有关联的数据,你是不能删除class表中与其关联的纪录的
            mysql> delete from class where id =1;
            ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`testdb`.`student2`, CONSTRAINT `fk_class_key` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))     

  MySQL NUll 值处理

  我们已经知道MySQL使用sql select命令及where子句来读取数据表中的数据,但是当提供的查询条件字段为NUll时,该命令可能就无法正常工作。
            为了处理这种情况,MySQL提供了三大运算符:
                is null:当列的值是null,此运算符返回true。
                is not null:当列的值不为null,运算符返回true。
                <=>:比较操作符(不同于=运算符),当比较的两个值为null时返回true。
                关于null的条件比较运算是比较特殊的,你不能使用=null或!=null在列中查找null值。
                在mysql中,null值与任何其它值的比较(即使是null)永远返回false,即null=null返回false。
                MySQL中处理null使用is null和is not null运算符。                

  MySQL 连接(left join ,right join,inner join,full join)

           

我们已经学会了如果在一张表中读取数据,这是相对简单的,但是真正的应用中经常需要从多张数据表中读取数据。
            本章节我们将向大家介绍如何使用MySQL和join在两个或多个表中查询数据。
            你可以在select ,update,和delete语句中使用MySQL的join来联合多表查询。
            join按照功能大致分为如下 三类:
                INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
                LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
                RIGHT JOIN(右连接):与LEFT JOIN相反,用于获取右表所有记录,即使左表没有对应匹配的记录。            

 

四、事务

    MySQL事务主要用于处理操作量大,复杂度高的数据,比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如邮箱,文章等,这样,这些数据库操作语句就构成一个事务。
    
        在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务。
        事务处理可以用来维护数据库的完整性,保证成批的sql语句要么全部执行,要么全部不执行。
        事务用来管理insert,update,dalete语句。
    一般来说,事务是必须满足4个条件(ACID):Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)
        1、事务的原子性:一组事务,要么成功,要么撤回。
        2、稳定性:有非法数据(外键约束之类),事务撤回
        3、隔离性:事务独立运行,一个事务处理后的结果,影响了其他事务,那么其他事务会撤回,事务的100%隔离,需要牺牲速度。
        4、可靠性:软、硬件崩溃后,Innodb数据表驱动会利用日志文件重构修改,可靠性和高速度不可兼得,innodb_flush_log_at_trx_commit选项,决定什么时候把事务保存到日志里。

  在MySQL控制台使用事务操作


      

 完成一个事务
            mysql> begin;
            Query OK, 0 rows affected (0.00 sec)
            
            mysql> select * from A;
            Empty set (0.00 sec)
            
            mysql> insert into A (id) values(1);
            Query OK, 1 row affected (0.00 sec)
            
            mysql> select * from A;
            +----+
            | id |
            +----+
            |  1 |
            +----+
            1 row in set (0.00 sec)
            
            mysql> commit;
            Query OK, 0 rows affected (0.00 sec)
        回滚一个事务
            mysql> begin;
            Query OK, 0 rows affected (0.00 sec)
            
            mysql> select * from A;
            +----+
            | id |
            +----+
            |  1 |
            +----+
            1 row in set (0.00 sec)
            
            mysql> insert into A(id)values(2);
            Query OK, 1 row affected (0.00 sec)
            
            mysql> rollback;
            Query OK, 0 rows affected (0.00 sec)
            
            mysql> select * from A;
            +----+
            | id |
            +----+
            |  1 |
            +----+
            1 row in set (0.00 sec)
        备注:
            如果发现不能回滚,处理如下:
                1、首先查看数据的存储引擎
                    mysql> show engines;
                    +------------+---------+------------------------------------------------------------+--------------+------+------------+
                    | Engine     | Support | Comment                                                    | Transactions | XA   | Savepoints |
                    +------------+---------+------------------------------------------------------------+--------------+------+------------+
                    | MRG_MYISAM | YES     | Collection of identical MyISAM tables                      | NO           | NO   | NO         |
                    | CSV        | YES     | CSV storage engine                                         | NO           | NO   | NO         |
                    | MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance     | NO           | NO   | NO         |
                    | InnoDB     | YES     | Supports transactions, row-level locking, and foreign keys | YES          | YES  | YES        |
                    | MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables  | NO           | NO   | NO         |
                    +------------+---------+------------------------------------------------------------+--------------+------+------------+
                    5 rows in set (0.00 sec)
                2、查看表使用的存储引擎
                    (1) show table status from db_name where name="table_name";
                    (2) show create table table_name;
                3、修改表引擎方法
                    altar table table_name engine=innodb;
                4、永久生效,修改配置文件
                    default-storage-engine=INNODB

 

五、索引

    MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。
    打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车
    索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以由多个单列索引,但这不是组合索引,组合索引,即一个索引包含多个列。
    创建索引时,你需要确保该索引是应用在sql查询语句的条件(一般作为where子句的条件)
    实际上,索引也是一张表,该表保证了主键与索引字段,并指向实体表的记录。
    上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行insert、update、delete,因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件,建立索引会占用磁盘空间索引文件。
    
   

  1、普通索引


 

       创建索引
            这是最基本的索引,它没有任何限制,他有以下几种创建方式:
                mysql> create index index_name on student(name);
                mysql> desc student;
                +--------+------------+------+-----+---------+----------------+
                | Field  | Type       | Null | Key | Default | Extra          |
                +--------+------------+------+-----+---------+----------------+
                | id     | int(11)    | NO   | PRI | NULL    | auto_increment |
                | name   | char(40)   | YES  | MUL | NULL    |                |
                | age    | int(11)    | NO   |     | NULL    |                |
                | iphone | bigint(20) | NO   |     | 100     |                |
                +--------+------------+------+-----+---------+----------------+
                4 rows in set (0.00 sec)
            如果是char、varchar类型,length可以小于字段实际长度,如果是blog和text类型,必须制定length(长度)。
        修改表结构
            ALTER mytable ADD INDEX [indexName] ON (username(length))
        创建表的时候直接指定
            CREATE TABLE mytable(
 
            ID INT NOT NULL,  
              
            username VARCHAR(16) NOT NULL,
              
            INDEX [indexName] (username(length))
              
            );  
        删除索引的语法
            DROP INDEX [indexName] ON mytable;   

  2、唯一索引

        它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值,如果是组合索引,则列值的组合必须唯一,他有以下几种创建方法:
        
       

创建索引
            创建索引
            CREATE UNIQUE INDEX indexName ON mytable(username(length))
             
             
            修改表结构
            ALTER mytable ADD UNIQUE [indexName] ON (username(length))
             
             
            创建表的时候直接指定
            CREATE TABLE mytable(
              
            ID INT NOT NULL,  
              
            username VARCHAR(16) NOT NULL,
              
            UNIQUE [indexName] (username(length))
              
            );  

       

  使用alter命令添加和删除索引

            有四种方式来添加数据表的索引:
            ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
            ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
            ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。
            ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。
             
             
            以下实例为在表中添加索引。
            mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
            你还可以在 ALTER 命令中使用 DROP 子句来删除索引。尝试以下实例删除索引:
            mysql> ALTER TABLE testalter_tbl DROP INDEX (c);
        使用alter命令添加和删除主键
            主键只能作用于一个列上,添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。实例如下:
            mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
            mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
             
            你也可以使用 ALTER 命令删除主键:
            mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
            删除指定时只需指定PRIMARY KEY,但在删除索引时,你必须知道索引名。
        显示索引信息
            SHOW INDEX FROM table_name\G
            
posted @ 2017-01-09 15:56  技术处理你  阅读(285)  评论(0编辑  收藏  举报