create table tab_name(
field1 type[完整性约束条件],
field2 type,
...
fieldn type
)[character set xxx];
创建表头时,我们要注意:在最后一列时,不需要加逗号,其余的都以逗号进行分隔。
举例:我们需要创建一个员工表employee
create table employee(
id int primary key auto_increment ,
name varchar(20),
gender bit default 1, -- gender char(1) default 1
birthday date,
entry_date date,
job varchar(20),
salary double(4,2) unsigned -- 注意,这里作为最后一个字段不加逗号
);
常用的约束条件有以下这些,约束条件为可选的条件。
primary key (非空且唯一) :能够唯一区分出当前记录的字段称为主键!
unique
not null
auto_increment 主键字段必须是数字类型。
语法 | 描述 |
---|---|
desc tab_name | 查看表结构 |
show columns from tab_name | 查看表结构 |
show tables | 查看当前数据库中的所有的表 |
show create table tab_name | 查看当前数据库表建表语句 |
语法 | 描述 |
---|---|
alter table tab_name add [column] 列名 类型[完整性约束条件][first|after 字段名]; | 关键字:add;添加列(字段),可同时添加多个列(字段) |
alter table tab_name modify 列名 类型 [完整性约束条件][first|after 字段名]; | 关键字:modify;修改一列类型 |
alter table tab_name change [column] 列名 新列名 类型 [完整性约束条件][first|after 字段名]; | 关键字:change;修改列名 |
alter table tab_name drop [column] 列名; | 关键字:drop;删除一列 |
rename table 表名 to 新表名; | 关键字:to修改表名 |
alter table tab_name add primary key(字段名称,…) | 关键字:add primary key;添加主键 |
drop table tab_name; | 删除表,需要区分删除字段 |
添加主键的易错点:
1. 主键的作用主要确定该数据的唯一性。一个表中只有一个主键,当有主键时,不能再添加;
2. eg:
mysql> create table test5(num int auto_increment);
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
create table test(num int primary key auto_increment);
-- 思考,如何删除主键?这就需要用到下面的两句
alter table test modify id int; -- auto_increment没了,但这样写主键依然存在,所以还要加上下面这句
alter table test drop primary key;-- 仅仅用这句也无法直接删除主键
除了单字段主键,还有多字段主键:
单字段主键的创建
create table users(
id INT primary key,
name varchar(20),
city varchar(20)
);
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
| city | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
多字段主键的创建:
create table users2(
id INT,
name varchar(20),
city varchar(20),
primary key(name,id)
);
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | NO | PRI | NULL | |
| city | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
创建一个表单,以下例子都将使用该表单。
CREATE TABLE ExamResult(
id INT PRIMARY KEY auto_increment,
name VARCHAR (20),
Chinese DOUBLE,
Math DOUBLE ,
English DOUBLE
);
表操作的关键字
关键字 | 描述 |
---|---|
WHERE | 子句指定应更新哪些行。如没有WHERE子句,则更新所有的行。 |
SET | 子句指示要修改哪些列和要给予哪些值 |
UPDATE | 语法可以用新值更新原有表行中的各列 |
语法 | 描述 |
---|---|
insert [into] tab_name (field1,filed2,…) values (value1,value2,…); | 关键字:insert;添加一条表单记录 |
delete from tab_name [where …] | 关键字:delete;delete语句只能删除表中的内容,不能删除表本身,想要删除表,用drop |
truncate table tab_name | 关键字:truncate;TRUNCATE TABLE也可以删除表中的所有数据,词语句首先摧毁表,再新建表。此种方式删除的数据不能在事务中恢复。 |
update tab_name set field1=value1,field2=value2,…[where 语句] | 关键字:update;修改表记录 |
增加一条记录insert:
insert [into] tab_name (field1,filed2,.......) values (value1,value2,.......);
insert into examresult (id,name,Chinese,Math,English) values (1,"小明",80,90,100);
如果需要对每一个都需要赋值时,可以不加字段名,直接写values。
insert into Examresult values(2,"晓燕",90,92,96);
· 除了对每一个赋值,还可以选择性的为某个字段赋值。
insert into Examresult (name,Chinese) value ("Jon",40);
插入多条记录
insert into Examresult value (4,"Jerry",90,71,99),
(5,"alivin",30,40,66);
+----+--------+---------+------+---------+
| id | name | Chinese | Math | English |
+----+--------+---------+------+---------+
| 1 | 小明 | 80 | 90 | 100 |
| 2 | 晓燕 | 90 | 92 | 96 |
| 3 | Jon | 40 | NULL | NULL |
| 4 | Jerry | 90 | 71 | 99 |
| 5 | alivin | 30 | 40 | 66 |
+----+--------+---------+------+---------+
修改表记录
update tab_name set field1=value1,field2=value2,......[where 语句]
update examresult set English=40 WHERE id=1;
修改表记录时,我们可以添加限制条件--WHERE,WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行。
+----+-------+---------+------+---------+
| id | name | Chinese | Math | English |
+----+-------+---------+------+---------+
| 1 | 小明 | 80 | 90 | 40 |
| 2 | 晓燕 | 90 | 92 | 96 |
| 3 | Jon | 40 | NULL | NULL |
| 4 | Jerry | 90 | 71 | 99 |
| 5 | alivin | 30 | 40 | 66 |
+----+-------+---------+------+---------+
删除表记录
delete from tab_name [where ....]
如果不跟where语句则删除整张表中的数据
delete只能用来删除一行记录
delete语句只能删除表中的内容,不能删除表本身,想要删除表,用drop
TRUNCATE TABLE也可以删除表中的所有数据,词语句首先摧毁表,再新建表。此种方式删除的数据不能在事务中恢复。
-- 删除id为5的记录
delete from examresult where id=5;
-- 删除表中所有记录。
delete from employee_new;-- 注意auto_increment没有被重置:alter table employee auto_increment=1;
auto_increment是用于主键自动增长的,从1开始增长,当你把第5条记录删除时,再插入一条数据时,主键值是6,不是5,主键值只会递增,不会因为删除了一条记录,主键值就发生改变.
-- 使用truncate删除表中记录。
truncate table emp_new;
表记录查询之关键字 | 描述 |
---|---|
where | 用来添加限制条件 |
distinct | 用来剔除重复行 |
as | 取别名作为显示使用 |
between (xx and xx) | 用来匹配值在某个范围内 |
in (xx,xx,xx); | 用来匹配某个值的信息. |
% | 表示任意多字符 |
_ | 表示一个字符 |
Order by | 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的别名 |
Asc | 升序,其中asc为默认值 |
Desc | 降序 |
查询表达式
SELECT *|field1,filed2 ... FROM tab_name
-- 其中from指定从哪张表筛选,*表示查找所有列,也可以指定一个列
-- 表明确指定要查找的列,distinct用来剔除重复行。
WHERE 条件
GROUP BY field
HAVING 筛选
ORDER BY field
LIMIT 限制条数
查询表单记录时,我们可以添加限制条件.
select子句查询
1.查看完整的数据表单:
select * from ExamResult;
2.查询完整的表单,并显示总成绩
select *,(Chinese+Math+English) as 总成绩 from Examresult;
3.过滤表中重复数据。
select distinct * from ExamResult;
4.思考题:查找的列之间没有用逗号隔开,会发生什么情况?
select name Chinese from ExamResult;
where子句,进行过滤查询.
1.查询学生姓名为晓燕的成绩.
select * from ExamResult where name='yuan';
2.查询语文分数大于90分(含90分)的学生.
select id,name,Chinese from ExamResult where Chinese>=90;
3.查询总分在250分以上的学生的所有同学成绩.
select name,Chinese+Math+English as 总成绩 from ExamResult where Chinese+Math+English>200 ;
------->注意点:where后面跟的子句不能用as的结果来代替,这与执行的优先级相关.
4.查询Chinese分数在80-95之间的同学.
select id,name,Chinese from examresult where Chinese between 80 and 95;
5.查询Math分数为90,91,92分的同学.
select id,name,Math from examresult where Math in (90,91,92);
6.查询缺考Math的学生的姓名.
select name from examresult where Math is null;
7.查询所有以J开头的同学的名字及所有成绩.
select * from examresult where name like "J%";
order by 进行排序
-- select *|field1,field2... from tab_name order by field [Asc|Desc]
1.对所有的同学以语文成绩,从高到低排序
select name,chinese from examresult order by Chinese;
2.对所有同学的总成绩从高到低排序
select *,(Chinese+Math+English) as 总成绩 from examresult order by 总成绩 desc;,
如果直接相加时,我们发现任何值与null相加都为null,所以我们遇到null应将值转化成0.
改进方法:ifnull()
select *,(ifnull(Chinese,0)+ifnull(MAth,0)+ifnull(English,0)) as 总成绩 from examresult order by 总成绩 desc;
having和where的区别:
having 和 where两者都可以对查询结果进行进一步的过滤,差别有:
<1>where语句只能用在分组之前的筛选,having可以用在分组之后的筛选;
<2>使用where语句的地方都可以用having进行替换
<3>having中可以用聚合函数,where中就不行。
聚合函数
聚合函数 | 描述 |
---|---|
COUNT(列名) | 统计行的个数,count(字段)不统计null值 |
SUM(列名) | 统计满足条件的行的内容和,sum仅对数值起作用,否则会报错 |
AVG(列名) | 统计满足条件的行的内容的平均数 |
Max(列名) | 求满足条件的行的最大值 |
Min(列名) | 求满足条件的行的最小值 |
Mysql在执行sql语句时的执行顺序: from where select group by having order by
分析:
select Chinese as Chinese成绩 from ExamResult where Chinese成绩 >70; ---- 不成功
select Chinese as Chinese成绩 from ExamResult having Chinese成绩 >90; — 成功
使用正则表达式查询
匹配名字以 小 开头的同学所有成绩
SELECT * FROM ExamResult WHERE name REGEXP ‘^小’;
匹配名字以 燕 结尾的同学所有成绩
SELECT * FROM ExamResult WHERE name REGEXP '燕$';
SELECT * FROM ExamResult WHERE name REGEXP 'J{2}';
语法 | 描述 |
---|---|
ALTER TABLE 表名 ADD FOREIGN KEY [CONSTRAINT 外键名字] (外键字段) REFERENCES 父表 (主键字段); | 如果没有定义外键名,默认为 “表名_ibfk_1” |
ALTER TABLE 表名 DROP FOREIGN KEY 外键名字; |
innodb支持的四种方式 | 描述 |
---|---|
ON DELETE CASCADE | -cascade方式 在父表上update/delete记录时,同步update/delete掉子表的匹配记录----外键的级联删除:如果父表中的记录被删除,则子表中对应的记录自动被删除 |
ON DELETE SET NULL | set null方式 在父表上update/delete记录时,将子表上匹配记录的列设为null-- 要注意子表的外键列不能为not null |
ON DELETE Restrict | 拒绝对父表进行删除更新操作(了解) |
ON DELETE No action | 在mysql中同Restrict,如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作(了解) |
创建外键
使用MySQL关联数据表时,创建外键的两种方式:创建表时增加外键,已存在表增加外键。
方式一:
--- 每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任
----主表
CREATE TABLE ClassCharger(
id TINYINT PRIMARY KEY auto_increment,
name VARCHAR (20),
age INT ,
is_marriged boolean -- show create table ClassCharger: tinyint(1)
);
INSERT INTO ClassCharger (name,age,is_marriged) VALUES ("冰冰",12,0),
("丹丹",14,0),
("歪歪",22,0),
("姗姗",20,0),
("小雨",21,0);
----子表
CREATE TABLE Student(
id INT PRIMARY KEY auto_increment,
name VARCHAR (20),
charger_id TINYINT, --切记:作为外键一定要和关联主键的数据类型保持一致
-- [ADD CONSTRAINT charger_fk_stu]FOREIGN KEY (charger_id) REFERENCES ClassCharger(id)
) ENGINE=INNODB;
INSERT INTO Student(name,charger_id) VALUES ("alvin1",2),
("alvin2",4),
("alvin3",1),
("alvin4",3),
("alvin5",1),
("alvin6",3),
("alvin7",2);
DELETE FROM ClassCharger WHERE name="冰冰";
INSERT student (name,charger_id) VALUES ("yuan",1);
-- 删除居然成功,可是 alvin3显示还是有班主任id=1的冰冰的;
-----------增加外键和删除外键---------
ALTER TABLE student ADD CONSTRAINT abc
FOREIGN KEY(charger_id)
REFERENCES classcharger(id);
ALTER TABLE student DROP FOREIGN KEY abc;
-- 准备两张表
-- company.employee
-- company.department
create table employee(
emp_id int auto_increment primary key not null,
emp_name varchar(50),
age int,
dept_id int
);
insert into employee(emp_name,age,dept_id) values
('A',19,200),
('B',26,201),
('C',30,201),
('D',24,202),
('E',20,200),
('F',38,204);
create table department(
dept_id int,
dept_name varchar(100)
);
insert into department values
(200,'人事部'),
(201,'技术部'),
(202,'销售部'),
(203,'财政部');
mysql> select * from employee;
+--------+----------+------+---------+
| emp_id | emp_name | age | dept_id |
+--------+----------+------+---------+
| 1 | A | 19 | 200 |
| 2 | B | 26 | 201 |
| 3 | C | 30 | 201 |
| 4 | D | 24 | 202 |
| 5 | E | 20 | 200 |
| 6 | F | 38 | 204 |
+--------+----------+------+---------+
rows in set (0.00 sec)
mysql> select * from department;
+---------+-----------+
| dept_id | dept_name |
+---------+-----------+
| 200 | 人事部 |
| 201 | 技术部 |
| 202 | 销售部 |
| 203 | 财政部 |
+---------+-----------+
rows in set (0.01 sec)
语法:SELECT * FROM employee,department;
笛卡尔积查询的结果为多张表的记录数的乘积.因为例子中的employee有6条记录,department有4条记录,所以笛卡儿积有24条记录.
+--------+----------+------+---------+---------+-----------+
| emp_id | emp_name | age | dept_id | dept_id | dept_name |
+--------+----------+------+---------+---------+-----------+
| 1 | A | 19 | 200 | 200 | 人事部 |
| 1 | A | 19 | 200 | 201 | 技术部 |
| 1 | A | 19 | 200 | 202 | 销售部 |
| 1 | A | 19 | 200 | 203 | 财政部 |
| 2 | B | 26 | 201 | 200 | 人事部 |
| 2 | B | 26 | 201 | 201 | 技术部 |
| 2 | B | 26 | 201 | 202 | 销售部 |
| 2 | B | 26 | 201 | 203 | 财政部 |
| 3 | C | 30 | 201 | 200 | 人事部 |
| 3 | C | 30 | 201 | 201 | 技术部 |
| 3 | C | 30 | 201 | 202 | 销售部 |
| 3 | C | 30 | 201 | 203 | 财政部 |
| 4 | D | 24 | 202 | 200 | 人事部 |
| 4 | D | 24 | 202 | 201 | 技术部 |
| 4 | D | 24 | 202 | 202 | 销售部 |
| 4 | D | 24 | 202 | 203 | 财政部 |
| 5 | E | 20 | 200 | 200 | 人事部 |
| 5 | E | 20 | 200 | 201 | 技术部 |
| 5 | E | 20 | 200 | 202 | 销售部 |
| 5 | E | 20 | 200 | 203 | 财政部 |
| 6 | F | 38 | 204 | 200 | 人事部 |
| 6 | F | 38 | 204 | 201 | 技术部 |
| 6 | F | 38 | 204 | 202 | 销售部 |
| 6 | F | 38 | 204 | 203 | 财政部 |
+--------+----------+------+---------+---------+-----------+
关键字 | 描述 |
---|---|
inner join | 内连接 |
left join | 左连接 |
right join | 右连接 |
full join | 全外连接,但是MySQL中不支持全外连接,可通过其他方式间接实现全外连接 |
语法:select * from 表单1,表单2 where 表单1.字段名 = 表单2.字段名;
------->等价于: select * from 表单1 inner join表单2 on 表单1.字段名 = 表单2.字段名;
select * from employee,department where employee.dept_id = department.dept_id;
+--------+----------+------+---------+---------+-----------+
| emp_id | emp_name | age | dept_id | dept_id | dept_name |
+--------+----------+------+---------+---------+-----------+
| 1 | A | 19 | 200 | 200 | 人事部 |
| 2 | B | 26 | 201 | 201 | 技术部 |
| 3 | C | 30 | 201 | 201 | 技术部 |
| 4 | D | 24 | 202 | 202 | 销售部 |
| 5 | E | 20 | 200 | 200 | 人事部 |
+--------+----------+------+---------+---------+-----------+
左外连接:在内连接得到的匹配结果的基础上增加左边有右边没有的结果.
语法: select * from 表单1 left join表单2 on 表单1.字段名 = 表单2.字段名;
select * from employee left join department on employee.dept_id = department.dept_id;
+--------+----------+------+---------+---------+-----------+
| emp_id | emp_name | age | dept_id | dept_id | dept_name |
+--------+----------+------+---------+---------+-----------+
| 1 | A | 19 | 200 | 200 | 人事部 |
| 5 | E | 20 | 200 | 200 | 人事部 |
| 2 | B | 26 | 201 | 201 | 技术部 |
| 3 | C | 30 | 201 | 201 | 技术部 |
| 4 | D | 24 | 202 | 202 | 销售部 |
| 6 | F | 38 | 204 | NULL | NULL |
+--------+----------+------+---------+---------+-----------+
右外连接:在内连接的基础上增加右边有左边没有的结果
语法: select * from 表单1 right join表单2 on 表单1.字段名 = 表单2.字段名;
select * from employee RIGHT JOIN department on employee.dept_id = department.dept_id;
+--------+----------+------+---------+---------+-----------+
| emp_id | emp_name | age | dept_id | dept_id | dept_name |
+--------+----------+------+---------+---------+-----------+
| 1 | A | 19 | 200 | 200 | 人事部 |
| 2 | B | 26 | 201 | 201 | 技术部 |
| 3 | C | 30 | 201 | 201 | 技术部 |
| 4 | D | 24 | 202 | 202 | 销售部 |
| 5 | E | 20 | 200 | 200 | 人事部 |
| NULL | NULL | NULL | NULL | 203 | 财政部 |
+--------+----------+------+---------+---------+-----------+
全外连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果
语法:
select * from 表单1 left join表单2 on 表单1.字段名 = 表单2.字段名;
Union
select * from 表单1 right join表单2 on 表单1.字段名 = 表单2.字段名;
select * from employee RIGHT JOIN department on employee.dept_id = department.dept_id
UNION
select * from employee LEFT JOIN department on employee.dept_id = department.dept_id;
+--------+----------+------+---------+---------+-----------+
| emp_id | emp_name | age | dept_id | dept_id | dept_name |
+--------+----------+------+---------+---------+-----------+
| 1 | A | 19 | 200 | 200 | 人事部 |
| 2 | B | 26 | 201 | 201 | 技术部 |
| 3 | C | 30 | 201 | 201 | 技术部 |
| 4 | D | 24 | 202 | 202 | 销售部 |
| 5 | E | 20 | 200 | 200 | 人事部 |
| NULL | NULL | NULL | NULL | 203 | 财政部 |
| 6 | F | 38 | 204 | NULL | NULL |
+--------+----------+------+---------+---------+-----------+
什么是索引?
一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重。说起加速查询,就不得不提到索引了。
为什么要有索引?
索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。
打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。
拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。
索引分类
索引分单列索引和组合索引(又称多列索引)。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。
索引的应用
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
索引的缺点
上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。
索引的特点
索引特点:创建与维护索引会消耗很多时间与磁盘空间,但查询速度大大提高!
创建索引也有两种方法:1.在创建表时创建索引;2.对已存在的表创建索引。
CREATE TABLE 表名 (
字段名1 数据类型 [完整性约束条件…],
字段名2 数据类型 [完整性约束条件…],
[UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY
[索引名] (字段名[(长度)] [ASC |DESC])
);
对语法各选项的说明:
1、unique|fulltext|spatial为可选参数,分别表示唯一索引、全文索引和空间索引;
2、index和key为同义词,两者作用相同,用来指定创建索引
3、col_name为需要创建索引的字段列,该列必须从数据表中该定义的多个列中选择;
4、index_name指定索引的名称,为可选参数,如果不指定,MYSQL默认col_name为索引值;
5、length为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度;
6、asc或desc指定升序或降序的索引值存储
特别注意:主键索引是一种特殊的唯一索引,不允许有空值。
CREATE TABLE emp1 (
id INT,
name VARCHAR(30) ,
INDEX index_name (name)
);
CREATE TABLE emp2 (
id INT,
name VARCHAR(30) ,
UNIQUE INDEX index_name (name)
);
CREATE TABLE emp3 (
id INT,
name VARCHAR(30) ,
resume VARCHAR(50),
FULLTEXT INDEX index_resume (resume)
);
CREATE TABLE emp4 (
id INT,
name VARCHAR(30) ,
INDEX index_id_name (id_name)
);
已存在的表创建索引也有两种方式:1.alter;2.create
CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名
ON 表名 (字段名[(长度)] [ASC |DESC]) ;
举例: create index index_name on emp1(name);
ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX
索引名 (字段名[(长度)] [ASC |DESC]) ;
举例: alter table emp1 add unique index index_name(name);
语法:DROP INDEX 索引名 on 表名
举例: drop index index_name on t1;
创建一个表单
create table t1(id int,name varchar(20));
创建一个函数,自动生成50万条数据
delimiter $$ #修改结束符为$$,避免函数的提示符与MySQL的结束符混乱。
create procedure autoinsert() #mysql自定义函数以Begin开头,end结尾
BEGIN
declare i int default 1;
while(i<200000)do
insert into t1 values(i,'jie');
set i=i+1;
end while;
END$$
delimiter ;
call autoinsert() #调用自定义函数
测试创建索引前需要消耗的时间。
select * from t1 where id=160000;
mysql> select * from t1 where id = 160000;
+--------+------+
| id | name |
+--------+------+
| 160000 | yuan |
+--------+------+
1 row in set (0.23 sec)
为id创建索引
create index index_id on t1(id);
create index index_name on t1(name);
创建索引也是需要消耗时间的,创建索引需要消耗资源
mysql> create index index_id on t1(id);
Query OK, 0 rows affected (1.44 sec)
Records: 0 Duplicates: 0 Warnings: 0
测试创建索引后查询内容需要消耗的时间。
select * from t1 where id=300000;
删除普通索引,创建多列索引
drop index index_id on t1;
drop index index_name on t1;
create index index_id_name on t1(id, name) ;
mysql> select * from t1 where id = 160000;
+--------+------+
| id | name |
+--------+------+
| 160000 | yuan |
+--------+------+
1 row in set (0.01 sec)
select * from t1 where id=300000;
mysql> create index index_id_name on t1(id, name) ;
Query OK, 0 rows affected (1.38 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> select * from t1 where id = 160000;
+--------+------+
| id | name |
+--------+------+
| 160000 | yuan |
+--------+------+
1 row in set (0.00 sec)
从实验上我们可以发现,创建多列索引的效率会比普通索引分别创建的效率要高,并且消耗资源比较少。
数据库基础