まず、インデックス
1、クラスタ化インデックス
通常、構築されたときにプライマリキーテーブルを指定しない場合は、テーブルの構造は、いくつかのリレーショナルデータベースでは、テーブルの主キーを追加しますと、データベースはtable文の構築を実行することを拒否します。実際には、テーブルの主キーの追加、及びませんが、「テーブル」と呼ばれます 「テーブル」の私の知識は非常に近いですし、そのデータは、無秩序なディスクストレージ上に置かれ、非常にきれいに配置されたライン毎に主キーテーブルを追加しませんでした。テーブルの主キー場合、テーブルは、ディスク構造体に格納されたツリー構造になった構造体のアラインメントによって形質転換され、全体のテーブルと同様に、いわゆるある指標となる「クラスタ化インデックス。」これは、主キーの役割は、データ形式を「インデックス(バランス木)」形式の配置の「テーブル」を変換することであるため、表は、1つのプライマリキーは、テーブルには唯一の「クラスタ化インデックス」を持つことができますを持つことができる理由です。
図は、主キーの構成図でテーブル(クラスタ化インデックス)です。データの(下を除く)、ツリーのすべてのノードがデータのプライマリキーフィールドで構成されており、一般的に私たちの主キーidフィールドを指定されています。データの底部は、実際のテーブルです。
私たちは、SQL文を実行した場合:
ID = 98テーブルSELECT * FROM。
リーフノードの値は、その後、葉ノードのデータ線を介して98に等しいIDを取るターゲット98の最初のインデックス。ここではリーフノードにバランスの取れたツリーを実行しているの詳細を説明するが、図から分かる、ルートから3つのツリーの合計だけ結果が3の世話を取得できるようにする必要がありません。
短所:再並べ替えツリー(インデックスにこのバランスの取れたツリー構造は、ツリー構造を破壊し、ツリー内の各ノードのデータ内容のバランスを変更しますインデックスデータに適切な状態、付加および欠失で維持しなければならない、そのため、毎回データが変更され、あなたが行かなければなりませんそれが正しいことを確実にする)の構造は、これは、インデックス外の操作の副作用が照会します理由をもたらすために、つまり、何の小さなパフォーマンス上のオーバーヘッドを持っていないでしょう。
2、非クラスタ化インデックス
非クラスタ化インデックスとインデックスとしてバランスのとれたツリーデータ構造と同じクラスタ化インデックス、。インデックスツリー構造の値はテーブルインデックスフィールドから各ノード、テーブル、プラス、インデックスへのユーザ名フィールドは、インデックス値は、データの変更は、DBMSは、インデックス構造を維持するために必要とされている名前のフィールドで構成されている場合正しさ。我々は複数のフィールドのテーブルにインデックスを追加した場合、別のインデックス構造の複数次に、各インデックス(非クラスタ化インデックス)互いに無相関を発生します。下記に示すように、
//非クラスタ化インデックスを作成します
create index index_birthday on user_info(birthday);
//查询生日在1995年11月1日出生用户的用户名
select user_name from user_info where birthday = '1995-11-01'
这句SQL语句的执行过程如下
首先,通过非聚集索引index_birthday查找birthday等于1995-11-01的所有记录的主键id值。然后,通过得到的主键id值执行聚集索引查找,找到主键id值对应的真实数据(数据行)存储的位置。最后,从得到的真实数据中取得user_name字段的值返回,取得最终的结果
非聚集索引和聚集索引的区别在于,通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 ,再使用主键的值通过聚集索引查找到需要的数据。
3、复合索引
有一种例外可以不使用聚集索引就能查询出所需要的数据, 这种索引称之为「覆盖索引」查询, 也就是复合索引或者多字段索引查询。当为字段建立索引以后,字段中的内容会被同步到索引之中,如果为一个索引指定两个字段,那么这个两个字段的内容都会被同步至索引之中。
先看下面这个SQL语句
//创建复合索引
create index index_birthday_and_user_name on user_info(birthday, user_name);
select user_name from user_info where birthday = '1995-11-01'
这句SQL语句的执行过程:
通过非聚集索引index_birthday_and_user_name查找birthday等于1995-11-01的叶节点的内容,叶节点中除了有user_name表主键id的值以外user_name字段的值也在里面,因此不需要通过主键id值去查找数据行的真实所在,直接取得叶节点中user_name的值返回即可,大大的提高了查询性能。
4、注意点
最左前缀匹配原则,非常重要的原则
create index index_name_email on user(name,email)
- 最左前缀匹配:必须按照从左到右的顺序匹配
select * from user where name='zhangsan'; #可以
select * from user where name='zhangsan'and email='163.com'; #可以
select * from user where email='[email protected]'; #不可以
二、建表
1.新建用户
1.1 登录MYSQL:
C:\mysql\mysql-5.6.41-winx64\bin>mysql -u root -p
Enter password: **********
1.2 创建用户:
mysql> insert into mysql.user(Host,User,Password) values("localhost","demo",password("1234"));
这样就创建了一个名为:demo 密码为:1234 的用户。
注意:此处的"localhost",是指该用户只能在本地登录,不能在另外一台机器上远程登录。如果想远程登录的话,将"localhost"改为"%",表示在任何一台电脑上都可以登录。也可以指定某台机器可以远程登录。
1.3 然后登录一下:
mysql>exit;
C:\mysql\mysql-5.6.41-winx64\bin>mysql -u demo -p
Enter password: **********
2.为用户授权
授权格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码";
2.1 登录MYSQL(有ROOT权限),这里以ROOT身份登录:
C:\mysql\mysql-5.6.41-winx64\bin>mysql -u demo -p
Enter password: **********
2.2 首先为用户创建一个数据库(testDB):
mysql>create database demoDB;
2.3 授权test用户拥有testDB数据库的所有权限(某个数据库的所有权限):
mysql>grant all privileges on demoDB.* to demo@localhost identified by '1234';
mysql>flush privileges;//刷新系统权限表
格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码";
2.4 如果想指定部分权限给一用户,可以这样来写:
mysql>grant select,update on demoDB.* to demo@localhost identified by '1234';
mysql>flush privileges; //刷新系统权限表
2.5 授权test用户拥有所有数据库的某些权限:
mysql>grant select,delete,update,create,drop on *.* to demo@"%" identified by "1234";
//test用户对所有数据库都有select,delete,update,create,drop 权限。
//@"%" 表示对所有非本地主机授权,不包括localhost。(localhost地址设为127.0.0.1,如果设为真实的本地地址,不知道是否可以,没有验证。)
//对localhost授权:加上一句grant all privileges on demoDB.* to demo@localhost identified by '1234';即可。
3. 删除用户
C:\mysql\mysql-5.6.41-winx64\bin>mysql -u demo -p
Enter password: **********
mysql>Delete FROM user Where User='demo' and Host='localhost';
mysql>flush privileges;
mysql>drop database demoDB; //删除用户的数据库
删除账户及权限:>drop user 用户名@'%';
>drop user 用户名@ localhost;
4. 修改指定用户密码
C:\mysql\mysql-5.6.41-winx64\bin>mysql -u demo -p
Enter password: **********
mysql>update mysql.user set password=password('新密码') where User="demo" and Host="localhost";
mysql>flush privileges;
5. 列出所有数据库
mysql>show database;
6. 切换数据库
mysql>use '数据库名';
7. 列出所有表
mysql>show tables;
8. 显示数据表结构
mysql>describe 表名;
9. 删除数据库和数据表
mysql>drop database 数据库名;
mysql>drop table 数据表名;