mysql创建索引

索引补充

…衆ロ難τιáo~ 提交于 2019-12-02 05:52:19
1、索引   索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。对于索引,会保存在额外的文件中。 2、索引种类 普通索引:仅加速查询 唯一索引:加速查询 + 列值唯一(可以有null) 主键索引:加速查询 + 列值唯一 + 表中只有一个(不可以有null) 组合索引:多列值组成一个索引, 专门用于组合搜索,其效率大于索引合并 全文索引:对文本的内容进行分词,进行搜索 索引合并,使用多个单列索引组合搜索 覆盖索引,select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖 3、相关命令 - 查看表结构 desc 表名 - 查看生成表的SQL show create table 表名 - 查看索引 show index from 表名 - 查看执行时间 set profiling = 1; SQL... show profiles; 4、使用索引和不使用索引 由于索引是专门用于加速搜索而生,所以加上索引之后,查询效率会快到飞起来。 # 有索引 mysql> select * from tb1 where name = 'wupeiqi-888'; +-----+-------------+---------------------+----------------------------------+-----------

聚簇索引与非聚簇索引

廉价感情. 提交于 2019-12-02 05:49:24
聚簇索引与非聚簇索引(也叫二级索引) 通俗点讲 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在key buffer命中时,速度慢的原因 澄清一个概念:innodb中,在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引,辅助索引叶子节点存储的不再是行的物理位置,而是主键值 何时使用聚簇索引与非聚簇索引 cluster.png 聚簇索引具有唯一性 由于聚簇索引是将数据跟索引结构放到一块,因此一个表仅有一个聚簇索引 一个误区:把主键自动设为聚簇索引 聚簇索引默认是主键,如果表中没有定义主键,InnoDB 会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB 会隐式定义一个主键来作为聚簇索引。InnoDB 只聚集在同一个页面中的记录。包含相邻健值的页面可能相距甚远。如果你已经设置了主键为聚簇索引,必须先删除主键,然后添加我们想要的聚簇索引,最后恢复设置主键即可。 此时其他索引只能被定义为非聚簇索引。这个是最大的误区

mysql 为大表添加索引,导致超时的解决办法

只愿长相守 提交于 2019-12-02 05:28:59
简单的创建索引语句 : create unique index inxName on table A('Col') 。 如果表数据量不大,没有问题,但是数据超过千万,可能你等了半天,却告知你超时了。 网上查到解决方案: 1. 复制表A 的数据结构 , 不复制数据 create table B like A; 2. 表B加上你需要的索引 3. 把原有数据导入新表 4. 修改表A 的名称为A_old , 修改B表的 表名为A. 我的问题出在步骤3. 使用如下语句导入A表数据到B : insert into B select * from A; 执行了半天,又提示错误 table x is full。 网上找到另一种导入方式,即把A表数据导入文件,然后load 进B表 select * from A into outfile '/var/money.txt'; load data infile '/var/money.txt' into table B; -- 这个路径需要和show variables like '%secure%'; 一致 我执行的时候提示没有权限,需要开启secure_file_priv 相关权限 ,我没有root用户权限,所以就放弃该方案了。 解决: insert into B select * from A; 错误提示 table x is full ,

PostgreSQL与MySQL比较

試著忘記壹切 提交于 2019-12-02 05:23:39
本帖最后由 osdba 于 2011-04-21 16:33 编辑 特性 MySQL PostgreSQL 实例 通过执行 MySQL 命令(mysqld)启动实例。一个实例可以管理一个或多个数据库。一台服务器可以运行多个 mysqld 实例。一个实例管理器可以监视 mysqld 的各个实例。 通过执行 Postmaster 进程(pg_ctl)启动实例。一个实例可以管理一个或多个数据库,这些数据库组成一个集群。集群是磁盘上的一个区域,这个区域在安装时初始化并由一个目录组成,所有数据都存储在这个目录中。使用 initdb 创建第一个数据库。一台机器上可以启动多个实例。 数据库 数据库是命名的对象集合,是与实例中的其他数据库分离的实体。一个 MySQL 实例中的所有数据库共享同一个系统编目。 数据库是命名的对象集合,每个数据库是与其他数据库分离的实体。每个数据库有自己的系统编目,但是所有数据库共享 pg_databases。 数据缓冲区 通过 innodb_buffer_pool_size 配置参数设置数据缓冲区。这个参数是内存缓冲区的字节数,InnoDB 使用这个缓冲区来缓存表的数据和索引。在专用的数据库服务器上,这个参数最高可以设置为机器物理内存量的 80%。 Shared_buffers 缓存。在默认情况下分配 64 个缓冲区。默认的块大小是 8K。可以通过设置

mysql--索引

痴心易碎 提交于 2019-12-02 05:07:28
转载自https://www.cnblogs.com/zslli/p/8946145.html InnoDb页存储结构 我们可能有很多熟悉的数据库储存引擎,比如说Inoodb,MyISAM,Memory。每一种储存引擎对于数据的持久化可能是不同的,比如说我们的Memory储存引擎的数据都是不会写进磁盘的,所有的数据是保存在内存中的,也就意味着如果我们的服务器进行重启以后,数据是不会被进行保存的。当然,因为MySQL数据库默认的储存引擎是使用的Inoodb,所以我们在这里是需要重点介绍这个储存引擎的。 Inoodb储存引擎是把数据储存在磁盘里面的储存引擎,它在内存和磁盘的交互中使用的是页这个数据单位。我们都知道一个事情就是我们在对磁盘进行访问的时候速度是非常慢的,所以我们肯定是不能接受一条数据一条数据的进行取用。所有数据划分为若干页,一个数据页是可以保存16kb的数据,也就是说我们每次在进行数据访问的时候是一次性的16kb数据。 InnoDb页中记录存储结构 数据页双向链表和页内记录单向链表 聚簇索引 索引的查找就是通过一层一层的定位来实现的,最上层的页我们称之为根节点,中间的我们称之为内节点,最底层的我们称之为叶子节点。我们就是通过页中的槽二分法快速的定位数据所在页或者组中,我们在进行遍历查找。 二级索引 二级索引和聚簇索引的区别就是叶子节点不包括完整的数据。

MySql数据库基础

删除回忆录丶 提交于 2019-12-02 05:02:37
MySql数据库 """ 1、什么是数据库:管理数据的系统 - 安装某种管理数据的系统 - 管理的对象本质是文件 2、存储数据的位置:内存、硬盘 3、什么是系统:运行在硬件基础上,管理其他软件 """ # 数据库的组成 """ 库:存放多张表 - 文件夹 表:包含多条相同结构的记录 - 文件 记录:包含多个key-value键值对的一条数据 - 二进制数据 字段:描述信息 - 信息本身 == key-value - 二进制数据 stu id name age gender 1 Bob 18 男 2 Tom 17 女 ... teacher ... """ 数据库的分类 # 1)关系与非关系 # 关系:数据库中表与表之间有联系 - mysql # 非关系:没有表概念 - redis、mongodb(介于关系与非关系) # 2)内存与硬盘 # 硬盘:数据可以永久存储 - mysql、mongodb # 内存:数据的存取效率极高 - redis、memcache # 3)sql与nosql # sql:数据库操作通过sql语句 # nosql:数据库操作就是key-value形式(value就是一条记录) # stu - {'name': 'Bob', 'age': 18} # stus - [{'name': 'Bob', 'age': 18}, {'name': 'Tom',

MySQL各大存储引擎

痴心易碎 提交于 2019-12-02 05:02:33
MySQL各大存储引擎: 最好先看下你下的MySQL支持什么数据库引擎 存储引擎主要有: 1. MyIsam , 2. InnoDB, 3. Memory, 4. Blackhole, 5. CSV, 6. Performance_Schema, 7. Archive, 8. Federated , 9 Mrg_Myisam 但是我们主要分析使用MyIsam 和InnoDB。其余略微带过,详情请分别百度。 (1)InnoDB: 定义: (默认的存储引擎) InnoDB是一个事务型的存储引擎,有行级锁定和外键约束。 Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别,关于数据库事务与其隔离级别的内容请见数据库事务与其隔离级别这类型的文章。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持FULLTEXT类型的索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。但是使用行级锁也不是绝对的

SQL关键字执行顺序,优化,索引概念

寵の児 提交于 2019-12-02 05:02:28
Sql 优化: 原因:性能低,执行时间太长,等待时间太长,sql语句欠佳,连接查询,索引失效,服务器参数设置不对 编写过程: select...dinstinct .. from ..join ..on ..where..group by ...having ..order by ..limit .. 解析过程: from .. on ...join ..where ..group by ...having .select dinstinct ..order by ..limit.. sql 优化 ,主要就是在优化索引 索引: 相当于书的目录,index 是帮助MySQL 高效获取数据的数据结构(树 b树 hash树) B树索引: 小的放左 大的放右 索引的弊端: 1.索引本身很大,可以存放在内存/硬盘, 通常为硬盘 2. 索引并不是所有情况均适用:少量数据,频繁更新的字段 ,很少使用的字段 3.索引会降低增删改的效率 提高查的效率 优势:提高查询效率 降低了IO使用率 降低cpu使用率 因为b树索引 本身就是一个好排序的结构 3层 Btree 可以存放 上百万条数据 Btree: 一般都是指B+ ,数据全部存放在叶节点中 B+ 树 中查询任意的数据次数 n次 (B+树的高度) 索引 分类: 单值索引 唯一索引 复合索引 主键索引:不能重复,主键不能为null 单值索引: 单列

MariaDB——(二)

风格不统一 提交于 2019-12-02 04:58:28
数据库常用操作 数据库的两个目录   数据存放目录:/var/lib/mysql/ 配置文件目录:/etc/my.cnf.d/ 查看数据库的变量   show global variables like '%pro%';   show session variables like '%pro%';   set session profiling=1;   show session variables like '%pro%';   --session变量只在会话层生效,退出会话再进入数据库那么配置就会失效。   --global变量在全局生效,但是重启数据库之后会失效,要想永久生效需要将参数设定写入到配置文件之中。   --将想要设置的变量值写到配置文件的[server]之下即可,这里需要注意的是:并不是所有的变量写到配置文件里都能生效。   show global variables like '%buffer_pool%';   set @@global.profiling=1;   set global profiling=0;   --不接global默认修改session,修改全局变量需要加上global。   --状态变量   用来保存mysqld运行中的统计数据的变量,状态变量没有办法修改。   show global status;   show session

MySQL创建索引

落花浮王杯 提交于 2019-12-02 03:40:30
mysql的数据索引我们开发的时候一定都会用到,比如我们的主键、唯一等这些都是有到索引的内容,但是如果只有这样的索引在我们的实际开发中肯定满足不了我们的需求,这个时候就需要我们来创建相关的索引,但是索引创建并不是胡乱的创建,以下给出大家一些建议 索引:提高数据查询的速度,一般创建索引的列为很少改动的列。 1、例句: select * from user where userId = '123456789'; userId很少改变且是唯一值,可以对userID创建索引; 2、例句:select * from user where name = '李明' and age = 26; 如果name和age是不能为null的列,那么我们可以对这两列单独建立索引,但是如果经常使用这两列进行查询,就要创建复合索引(name, age); 3、例句:select * from user where name = '李明' and age = 26 and height = 175; 此时我们既想满足上面的条件又想满足下面的查询语句的条件的索引,可以会创建两个索引(name,age)和(name,age,height),但是通常可以创建复合索引(name,age,height)即可,因为复合索引满足最佳左前缀原则,会创建以下三个索引(name,age,height)、(name,age)、