首页 > 其他分享 >索引

索引

时间:2022-12-22 11:35:48浏览次数:54  
标签:name -- app 索引 user SELECT

索引

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。

提取句子主干,就可以得到索引的本质:索引是数据结构。

1.索引的分类

在一个表中,主键索引只能有一个,唯一索引可以有多个。

  • 主键索引 (PRIMARY KEY)

    • 唯一的标识,主键不可重复,只有一个列作为主键
  • 唯一索引 (UNIQUE KEY)

    • 避免重复的列出现,唯一索引可以重复,多个列都可以标识为唯一索引
  • 常规索引 (KEY)

    • 默认的,index、key关键字来设置
  • 全文索引 (FullText)

    • 在特定的数据库引擎下才有,MyISAM
    • 快速定位数据

基础语法

-- 索引的使用
-- 1、在创建表的时候给字段增加索引
-- 2、创建完毕后,增加索引

-- 显示所有的索引信息
SHOW INDEX FROM student;

-- 增加一个全文索引 (索引名) 列名
ALTER TABLE school.student ADD FULLTEXT INDEX `studentName`(`studentName`);

-- EXPLAIN 分析sql执行的状况 

EXPLAIN SELECT * FROM student; -- 非全文索引

EXPLAIN SELECT * FROM student WHERE MATCH(StudentName) AGAINST('刘'); 

2.测试索引

CREATE TABLE `app_user` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) DEFAULT '' COMMENT '用户昵称',
`email` VARCHAR(50) NOT NULL COMMENT '用户邮箱',
`phone` VARCHAR(20) DEFAULT '' COMMENT '手机号',
`gender` TINYINT(4) UNSIGNED DEFAULT '0' COMMENT '性别(0:男;1:女)',
`password` VARCHAR(100) NOT NULL COMMENT '密码',
`age` TINYINT(4) DEFAULT '0' COMMENT '年龄',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`update_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='app用户表'



-- 插入100万数据
DROP FUNCTION IF EXISTS mock_data;
DELIMITER $$ -- 写函数之前必须要写,标志
CREATE FUNCTION mock_data()
RETURNS INT
BEGIN
DECLARE num INT DEFAULT 1000000;
DECLARE i INT DEFAULT 0;
WHILE i < num DO
  INSERT INTO app_user(`name`, `email`, `phone`, `gender`, `password`, `age`)
   VALUES(CONCAT('用户', i), '[email protected]', CONCAT('18', FLOOR(RAND()*(999999999-100000000)+100000000)),FLOOR(RAND()*2),UUID(), FLOOR(RAND()*100));
  SET i = i + 1;
END WHILE;
RETURN i;
END;
SELECT mock_data();

SELECT * FROM app_user WHERE `name`='用户9999'; -- 0.500 sec
SELECT * FROM app_user WHERE `name`='用户9999'; -- 0.727 sec
SELECT * FROM app_user WHERE `name`='用户9999'; -- 0.474 sec

EXPLAIN SELECT * FROM app_user WHERE `name`='用户9999';


-- id_表名_字段名
-- CREATE INDEX 索引名 ON 表(字段名);
CREATE INDEX id_user_name ON app_user(`name`);
SELECT * FROM app_user WHERE `name`='用户9999'; -- 0.003 sec
SELECT * FROM app_user WHERE `name`='用户9999'; -- 0 sec

EXPLAIN SELECT * FROM app_user WHERE `name`='用户9999';

索引在小数据量的时候,用处不大;但是在大数据的时候,区别十分明显。

3.索引原则

  • 索引不是越多越好
  • 不要对经常变动的数据加索引
  • 小数据量的表不需要加索引
  • 索引一般加在常用来查询的字段上

4.索引的数据结构

http://blog.codinglabs.org/articles/theory-of-mysql-index.html

标签:name,--,app,索引,user,SELECT
From: https://www.cnblogs.com/dengovo/p/16998004.html

相关文章

  • KingbaseES V8R6数据库运维案例之---索引坏块故障处理
    案例说明:在执行表数据查询时,出现下图所示错误,索引故障导致表无法访问,后重建索引问题解决。本案例复现了此类故障解决过程。适用版本:KingbaseESV8R3/R6一、创建测试......
  • MySql索引下推知识分享
    作者:刘邓忠Mysql是大家最常用的数据库,下面为大家带来mysql索引下推知识点的分享,以便巩固mysql基础知识,如有错误,还请各位大佬们指正。1什么是索引下推索引下推(IndexCondit......
  • postgresql jsonb + 索引 + 分区 + 测试
    --创建表DROPTABLEIFEXISTStba;CREATETABLEtba(idserial,peaktempint,jsjsonb,logdatedatenotnull)PARTITIONBYRANGE(logdate); --设置主键......
  • DB2创建普通索引,唯一索引
    --创建单个普通索引CREATEINDEX索引名ON模式名.表名(列名1);--创建联合索引CREATEINDEX索引名ON模式名.表名(列名1,列名2);--创建唯一索引CREATEUNIQUEINDEX......
  • 【高级数据库】第二章 第01讲 数据库索引
    【高级数据库】第二章数据库索引  在第一章我们主要介绍了数据库的基础知识,包括数据库和数据库管理系统的概念,了解了数据库管理系统是如何执行用户命令的。另外还回顾了......
  • MySQL 索引的创建、删除
    MySQL中索引的创建有三种方法,索引的删除有两种方法。一、创建索引(1)使用createindex#1.创建普通索引createindex索引名on表名(列名[(限制索引长度)]);#2.创建......
  • MySQL——InnoDB索引原理
    一、各种树形结构 1、二叉树:允许每个节点下最多有两个子节点 二叉树在数据库中不使用的原因是: 1)、树长歪了---》树的倾斜问题 查询的代价是不可控的,主要原因是树的高......
  • 索引数据结构底层(全)
    读者忠告由于本文内容篇幅较长,涵盖了大家学习上、工作上的绝大多数索引,建议大家每一小节都认真阅读并理解透彻,如有疑问可在评论区留言探讨;文章目录​​读者忠告​​​​一、......
  • 索引下推总结
    索引下推(indexconditionpushdown)简称ICP,在Mysql5.6的版本上推出,用于优化查询。在不使用ICP的情况下,在使用非主键索引(又叫普通索引或者二级索引)进行查询时,存储引擎......
  • 我说MySQL联合索引遵循最左前缀匹配原则,面试官让我回去等通知
    携手创作,共同成长!这是我参与「掘金日新计划·8月更文挑战」的第6天,点击查看活动详情面试官:我看你的简历上写着精通MySQL,问你个简单的问题,MySQL联合索引有什么特性?心......