首页 > 数据库 >Mysql索引

Mysql索引

时间:2023-05-26 12:35:10浏览次数:48  
标签:index name -- DEFAULT 索引 emp Mysql

1. 索引快速入门  791

说起提高数据库性能,索引是最物美价廉的东西了。不用加内存,不用改程序,不用调sql,查询速度就可能提高百倍干倍。这里我们举例说明索引的好处[构建海量表8000000] 

是不是建立一个索引就能解决所有的问题?

ename.上没有建立索引会怎样?

select * from emp where ename=

'axJxC'

代码在E:\java学习\初级\course162\db_

big_sea

-- 创建测试数据库   老韩提供 tmp
CREATE DATABASE tmp

CREATE TABLE dept( /*部门表*/
deptno MEDIUMINT   UNSIGNED  NOT NULL  DEFAULT 0,
dname VARCHAR(20)  NOT NULL  DEFAULT "",
loc VARCHAR(13) NOT NULL DEFAULT ""
) ;

#创建表EMP雇员
CREATE TABLE emp
(empno  MEDIUMINT UNSIGNED  NOT NULL  DEFAULT 0, /*编号*/
ename VARCHAR(20) NOT NULL DEFAULT "", /*名字*/
job VARCHAR(9) NOT NULL DEFAULT "",/*工作*/
mgr MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,/*上级编号*/
hiredate DATE NOT NULL,/*入职时间*/
sal DECIMAL(7,2)  NOT NULL,/*薪水*/
comm DECIMAL(7,2) NOT NULL,/*红利*/
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0 /*部门编号*/
) ;

#工资级别表
CREATE TABLE salgrade
(
grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0,
losal DECIMAL(17,2)  NOT NULL,
hisal DECIMAL(17,2)  NOT NULL
);

#测试数据
INSERT INTO salgrade VALUES (1,700,1200);
INSERT INTO salgrade VALUES (2,1201,1400);
INSERT INTO salgrade VALUES (3,1401,2000);
INSERT INTO salgrade VALUES (4,2001,3000);
INSERT INTO salgrade VALUES (5,3001,9999);

DELIMITER $$

#创建一个函数,名字 rand_string,可以随机返回我指定的个数字符串
CREATE FUNCTION rand_string(n INT)
RETURNS VARCHAR(255) #该函数会返回一个字符串
BEGIN
#定义了一个变量 chars_str, 类型  varchar(100)
#默认给 chars_str 初始值   'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ'
 DECLARE chars_str VARCHAR(100) DEFAULT
   'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ'; 
 DECLARE return_str VARCHAR(255) DEFAULT '';
 DECLARE i INT DEFAULT 0; 
 WHILE i < n DO
    # concat 函数 : 连接函数mysql函数
   SET return_str =CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1));
   SET i = i + 1;
   END WHILE;
  RETURN return_str;
  END $$


 #这里我们又自定了一个函数,返回一个随机的部门号
CREATE FUNCTION rand_num( )
RETURNS INT(5)
BEGIN
DECLARE i INT DEFAULT 0;
SET i = FLOOR(10+RAND()*500);
RETURN i;
END $$

 #创建一个存储过程, 可以添加雇员
CREATE PROCEDURE insert_emp(IN START INT(10),IN max_num INT(10))
BEGIN
DECLARE i INT DEFAULT 0;
#set autocommit =0 把autocommit设置成0
 #autocommit = 0 含义: 不要自动提交
 SET autocommit = 0; #默认不提交sql语句
 REPEAT
 SET i = i + 1;
 #通过前面写的函数随机产生字符串和部门编号,然后加入到emp表
 INSERT INTO emp VALUES ((START+i) ,rand_string(6),'SALESMAN',0001,CURDATE(),2000,400,rand_num());
  UNTIL i = max_num
 END REPEAT;
 #commit整体提交所有sql语句,提高效率
   COMMIT;
 END $$

 #添加8000000数据
CALL insert_emp(100001,8000000)$$

#命令结束符,再重新设置为;
DELIMITER ;

SELECT COUNT(*) FROM emp;-- 这里有八百万条记录

-- 在没有创建索引时,我们的查询一条记录  需要花3.5秒    791
SELECT *
	FROM emp
	WHERE empno = 1234567
	
-- 使用索引来优化一下, 体验索引的牛
-- 在没有创建索引前 , emp.ibd 文件大小 是 524m
-- 创建索引后 emp.ibd 文件大小 是 655m [索引本身也会占用空间.]
-- 创建 ename 列索引,emp.ibd 文件大小 是 827m
-- empno_index 索引名称
-- ON emp (empno) : 表示在 emp 表的 empno 列创建索引
CREATE INDEX empno_index ON emp (empno)

-- 创建索引后, 查询的速度如何
SELECT *
	FROM emp
	WHERE empno = 1234578 -- 0.003s  原来是 3.5s

-- 创建索引后,只对创建了索引的列有效
SELECT *
	FROM emp
	WHERE ename = 'PjDlwy' -- 没有在 ename 创建索引时,时间 3.5s
-- 在ename创建索引
CREATE INDEX ename_index ON emp(ename)
SELECT *
	FROM emp
	WHERE ename = 'PjDlwy'-- 0.004s

2. 索引的原理  792

没有索引为什么会慢?因为全表扫描.

使用索引为什么会快?形成个索引的数据结构,比如二叉树

索引的代价

I.磁盘占用

II.对dml(update delete insert)语句的效率影响

在我们项目中,select[90%]多,update,delete,insert[10%]操作

Mysql索引_主键

3. 索引的类型  793

1.主键索引,主键自动的为主索引(类型Primary key)

2.唯一索引(UNIQUE)

3.普通索引(INDEX)

4.全文索引(FULLTEXT) [适用于MyISAM]一般开发,不使用mysqI自带的全文索引,

而是使用:全文搜索Solr和ElasticSearch (ES)

Mysql索引_字符串_02

4. 索引使用  793-794

1.添加索引(建小表测试id , name )

create [UNIQUE] index index name on tbl name (col name [(length)] [ASC | DESC],....);

alter table table name ADD INDEX [index name] (index col name..)

2.添加主键(索引) ALTER TABLE表名ADD PRIMARY KEY(列名..);

3.删除索引

DROP INDEX index name ON tbl_name;

alter table table name drop index index_name;

4.删除主键索引比较特别: alter table t_b drop primary key;

5.查询索引(三种方式)

show index(es) from table_name;

show keys from table_name;

desc table_Name;

代码在E:\java学习\初级\course162\db_

index_use

#演示mysql的索引使用  793
-- 创建索引
CREATE TABLE t25(
	id INT,
	`name` VARCHAR(32));
-- 查询表是否有索引
SHOW INDEXES FROM t25
-- 添加索引
-- 1. 如果某列的值,是不会重复的,则优先考虑使用 unique 索引, 否则使用普通索引
-- 添加唯一索引
CREATE UNIQUE INDEX id_index ON t25(id)
-- 添加普通索引 方式1
CREATE INDEX id_index ON t25(id)
-- 添加普通索引方式 2
ALTER TABLE t25 ADD INDEX id_index(id)
-- 添加主键索引
CREATE TABLE t26(
	id INT,
	`name` VARCHAR(32));
ALTER TABLE t26 ADD PRIMARY KEY (id)#添加主键索引
SHOW INDEXES FROM t26

-- 删除索引  794
DROP INDEX id_index ON t25
SHOW INDEXES FROM t25
-- 删除主键索引
ALTER TABLE t26 DROP PRIMARY KEY 
SHOW INDEXES FROM t26

-- 修改索引:就是先删除,在添加新的索引

-- 查询索引
-- 方式一
SHOW INDEX FROM t25
-- 方式二
SHOW INDEXES FROM t25
-- 方式三
SHOW KEYS FROM t25
-- 方式四
DESC t25

5. 小结: 哪些列上适合使用索引  795

1.较频繁的作为查询条件字段应该创建索引

select * from emp where empno = 1

2.唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件

select * from emp where sex = '男'

3. 更新非常频繁的字段不适合创建索引

select * from emp where logincount = 1

4.不会出现在WHERE子句中字段不该创建索引

标签:index,name,--,DEFAULT,索引,emp,Mysql
From: https://blog.51cto.com/u_15784725/6354941

相关文章

  • mysql事务
    1. mysql 事务1.1 什么是事务事务用于保证数据的一致性,它由一组相关的dml语句组成该组的dml语句要么全部成功,要么全部失败。如:转账就要用事务来处理,用以保证数据的一致性。2. 事务和锁  796-797当执行事务操作时(dml语句) ,mysql会在表 上加锁,防止其它用户改表的数据.这对......
  • mysql表类型和存储引擎和视图
    1. mysql表类型和存储引擎  8031.1 基本介绍1. MySQL的表类型由存储引擎(Storage Engines)决定,主要包括MyISAM、innoDB、Memory等。2. MySQL数据表主要支持六种类型,分别是: CSV、 Memory、ARCHIVE、MRG_MYISAM、MYISAM、 InnoBDB.3.这六种又分为两类,一类是”事务安全型”......
  • mysql用户管理
    1. Mysql 用户  808其中user表的重要字段说明:1. host: 允许登录的"位置”, localhost表示该用户只允许本机登录,也可以指定ip地址,比如:192.168.1.1002. user: 用户名;3. authentication string:密码,是通过mysql的password()函数加密之后的密码。1.1 创建用户  808cre......
  • 数据库系列-MYSQL篇之-主从同步
    1主从同步概述mysql主从同步,即MySQLReplication,可以实现将数据从一台数据库服务器同步到多台数据库服务器。MySQL数据库自带主从同步功能,经过配置,可以实现基于库、表结构的多种方案的主从同步。可以对MySQL做主从架构并且进行读写分离,让主服务器(Master)处理写请求,从服务器(Sla......
  • MySQL中--skip-password参数作用
     MySQL中--skip-password参数探究 本篇使用客户端:mysql版本:MySQL8认证插件:mysql_native_password对于初始化数据库时,若是使用了--initialize-inscure选项,则对于用户root@localhost会使用空密码。2023-05-26T09:20:21.205673+08:006[Warning][MY-010453][Server]roo......
  • mysql创建用户及分配操作权限
    MySQL在安装时,会默认创建一个名为root的用户,该用户拥有超级权限,可以控制整个MySQL服务器,所以如果滥用root账户,对于系统来说是很不安全的。MySQL提供了以下3种方法创建用户。使用GRANT语句创建用户使用CREATEUSER语句创建用户在mysql.user表中添加用户1.使......
  • 关于MySQL的JDBC Driver加载过程详解
    在使用JDBC时,都需要提前加载对应数据库的Driver类,MySQL为例:Class.forName("com.mysql.jdbc.Driver")但是不写这句代码也可以让 com.mysql.jdbc.Driver类成功加载,这就涉及到java.sql.DriverManager类了,先看一下代码:publicclassDriverManager{//注册驱动的集合priva......
  • 5分钟搞定Linux安装Mysql5.7(简单快捷,建议收藏)
    本文记录下我近期在Linux环境下安装Mysql5.7的实践经历。服务器版本Mysql版本Centos7.65.7.321.下载Mysql下载地址:https://downloads.mysql.com/archives/community/进入页面后选择你需要的版本进行下载,这里提供了2种格式:tar.gz和tar。如果下载不方便,可以直接从我的网盘里面下......
  • MySQL常用命令
    #安装mysql后查看初始密码cat/var/log/mysqld.log#登录mysqlmysql-u[user]-p[密码]-h[远程主机ip]#本地登录可以简写为mysql-uroot-p#设置密码长度#【8.0】setglobalvalidate_password.length=6;#【5.7】setglobalvalidate_password_length=6;#设置......
  • MySQL安装
    1、检查是否已经安装了mysql和mariadbrpm-qa|grepmysqlrpm-qa|grepmariadb#如果已经安装,就先卸载:rpm-e--nodeps软件名2、安装mysql按顺序安装:8.0.28-1.el7版本rpm-ivhmysql-community-common-8.0.28-1.el7.aarch64.rpmrpm-ivhmysql-community-cli......