mysql索引

mysql索引的简介

*爱你&永不变心* 提交于 2020-02-03 09:21:08
1.索引是什么? 官方定义:索引是帮助MySQL高效获取数据的数据结构,所以索引的本质是数据结构。 当然还有一个更为简单的理解是:数据本身之外,数据库还维护这一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法, 而这个数据结构就是索引。 存储位置:因为索引本身也很好,因此不可能全部都放在内存中,往往都是以索引文件的方式存储在 磁盘 上。 默认索引采用的算法: 一般采用BTREE 。 2.索引的优势 1)类似图书馆建书目索引,提高数据检索的效率,降低数据库的IO成本。 2)通过索引列对数据进行排序,降低数据排序成本,降低了CPU的消耗。 3.索引的劣势 1)实际上索引也是一张表,该表的主要内容就是保存索引的字段,并且指向具体表的记录,因此索引会占据空间。 2)虽然索引可以提高查询速度,同时却会降低更新表的速度,如果对表进行insert、delete和update时,因为在这过程中,MySQL不仅要保存数据到具体表,也要保存索引文件。 3)索引只是提高sql效率的一个因素,如何建立索引需要花费大量是时间建立适合的索引。 4.索引的分类 1)单值索引:即一个索引只包含单个列,一个表可以有多个单列索引。 2)唯一索引:索引列的值必须唯一,但允许有空值。 3)复合索引:一个索引包含多个数据表字段。(在高并发条件下,倾向建立复合索引

MySQL-索引优化案例

孤街浪徒 提交于 2020-02-03 09:17:36
单表优化 建表 create table article ( id int unsigned not null primary key auto_increment , author_id int unsigned not null , category_id int unsigned not null , views int unsigned not null , comments int unsigned not null , title varchar ( 255 ) not null , content text not null ) ; 插入数据 insert into article ( ` author_id ` , ` category_id ` , ` views ` , ` comments ` , ` title ` , ` conte nt ` ) values ( 1 , 1 , 1 , 1 , '1' , '1' ) , ( 2 , 2 , 2 , 2 , '2' , '2' ) , ( 1 , 1 , 3 , 3 , '3' , '3' ) ; 现在比如说我们要查询category_id为1且comments大于1的情况下,views最多的article_id 我们要完成这个功能应该使用的sql语句为 select * from article

MySQL数据库详解(二)

半腔热情 提交于 2020-02-03 03:54:34
紧跟上一篇文章,我们继续学习MySQL数据库。 数据库意义:数据存储,数据管理 DML语言:数据操作语言 Insert update delete 1.添加Insert 语法: insert into 表名([字段名1,字段2,字段3])values('值1'),('值2'),('值3',....) 举例: -- 插入语句(添加) -- insert into 表名([字段名1,字段2,字段3])values('值1'),('值2'), INSERT INTO ` grade ` ( ` gradename ` ) VALUES ( '大四' ) -- 由于主键自增我们可以省略 (如果不写表的字段,他就会一一匹配) INSERT INTO ` grade ` VALUES ( '大三' ) -- 插入多个字段 INSERT INTO ` grade ` ( ` gradename ` ) VALUES ( '大二' ) , ( '大一' ) INSERT INTO ` student ` ( ` name ` , ` pwd ` , ` sex ` ) VALUES ( '张三' , 'aaaaaa' , '男' ) 注意: 1. 字段和字段之间使用 英文逗号 隔开 2. 字段是可以省略的,但是后面的值必须要要一一对应,不能少 3. 可以同时插入多条数据,VALUES 后面的值

为什么InnoDB表必须有主键,并且推荐使用整型的自增主键?

爷,独闯天下 提交于 2020-02-03 01:31:23
innoDB索引文件和数据文件是在一起的 frm:表结构;ibd:索引文件和数据文件 问:为什么InnoDB表必须有主键。并且推荐使用整型的自增主键: 1、如果设置了主键,那么InnoDB会选择主键作为聚集索引、如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引、如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增)。 2、如果表使用自增主键 那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,主键的顺序按照数据记录的插入顺序排列,自动有序。当一页写满,就会自动开辟一个新的页 3、如果使用非自增主键(如果身份证号或学号等) 由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置,此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。 问:为什么非主键索引结构叶子结点存储的是主键值: 减少了出现行移动或者数据页分裂时二级索引的维护工作(当数据需要更新的时候,二级索引不需要修改,只需要修改聚簇索引

mysql索引介绍

此生再无相见时 提交于 2020-02-02 17:30:20
1、索引是什么   索引(Index)是帮助MySQL高效获取数据的数据结构。可以得到索引的本质:索引是数据结构。   可以理解为“排好序的快速查找数据结构”   在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,   这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。 2、优势   类似大学图书馆建书目索引,提高数据检索效率,降低数据库的IO成本。   通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗。 3、劣势   实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占空间的。   虽然索引大大提高了查询速度,同时确会降低更新表的速度,如对表进行INSERT、UPDATE、DELETE。   因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段。   都会调整因为更新所带来的键值变化后的索引信息。 4、索引的分类    注意:索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引             MyISAM和InnoDB存储引擎:只支持BTREE索引, 也就是说默认使用BTREE,不能够更换             MEMORY/HEAP存储引擎:支持HASH和BTREE索引        1、索引我们分为四类来讲

MySQL索引 - 索引的类型

橙三吉。 提交于 2020-02-02 12:15:08
索引的类型 B-Tree索引 B-Tree 索引 通常意味着所有的值都是 按顺序存储 的,并且每一个叶子页到根的距离相同。 B-Tree 索引 能够 加快访问数据的速度 ,存储引擎 不再需要进行全表扫描 来获取需要的数据,取而代之的是 从索引的根节点开始搜索 。 B-Tree 索引 适用于全键值、键值范围或键前缀查找( 最左前缀原则 )。 哈希索引 哈希索引 基于哈希表实现,只有 精确匹配索引 所有列的查询才有效。 哈希索引 是Memory引擎表的默认索引类型,但Memory同时也支持B-Tree索引。 哈希索引 自身 只需存储对应的哈希值和行指针 ,而 不存储字段值 ,所以索引的结构十分紧凑,这也让哈希索引查找的速度非常快。 哈希索引 数据并不是按照索引值顺序存储的,所以 无法用于排序 。 哈希索引 不支持部分索引列匹配查找 ,因为哈希索引始终是使用索引列的全部内容来计算哈希值的。例如数据列(A,B)上建立索引,如果查询只有数据列A,则无法使用该索引。 哈希索引 不支持任何范围查询 ,如WHERE score > 60。 哈希索引 只支持等值比较查询 ,包括=、IN()、<=>(注意<>和<=>是不同的操作)。 介绍一个 使用场景 :如需要存储大量的URL,并需要根据URL进行搜索查找。如果使用B-Tree来存储URL,存储的内容就会非常大,因为URL本身很长。 创建表 1

MySQL(ORM框架)

可紊 提交于 2020-02-02 08:50:44
day63 参考: http://www.cnblogs.com/wupeiqi/articles/5713330.html SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如: MySQL-Python mysql+mysqldb://< user >:< password >@<host>[:<port>]/<dbname> pymysql mysql+pymysql://<username>:< password >@<host>/<dbname>[?<options>] MySQL-Connector mysql+mysqlconnector://< user >:< password >@<host>[:<port>]/<dbname> cx_Oracle oracle+cx_oracle:// user :pass@host:port/dbname[? key =value& key =value...] 更多详见:http://docs.sqlalchemy.org/en/latest/dialects/ index .html 可以连接不同的数据库。 1. ORM框架:SQLAlchemy - 作用: 1. 提供简单的规则 2.

索引使用策略及优化

不羁岁月 提交于 2020-02-01 22:20:58
索引使用策略及优化 MySQL的优化主要分为结构优化(Scheme optimization)和查询优化(Query optimization)。本章讨论的高性能索引策略主要属于结构优化范畴。本章的内容完全基于上文的理论基础,实际上一旦理解了索引背后的机制,那么选择高性能的策略就变成了纯粹的推理,并且可以理解这些策略背后的逻辑。 示例数据库 为了讨论索引策略,需要一个数据量不算小的数据库作为示例。本文选用MySQL官方文档中提供的示例数据库之一:employees。这个数据库关系复杂度适中,且数据量较大。下图是这个数据库的E-R关系图(引用自MySQL官方手册): 图12 MySQL官方文档中关于此数据库的页面为 http://dev.mysql.com/doc/employee/en/employee.html 。里面详细介绍了此数据库,并提供了下载地址和导入方法,如果有兴趣导入此数据库到自己的MySQL可以参考文中内容。 最左前缀原理与相关优化 高效使用索引的首要条件是知道什么样的查询会使用到索引,这个问题和B+Tree中的“最左前缀原理”有关,下面通过例子说明最左前缀原理。 这里先说一下联合索引的概念。在上文中,我们都是假设索引只引用了单个的列,实际上,MySQL中的索引可以以一定顺序引用多个列,这种索引叫做联合索引,一般的,一个联合索引是一个有序元组<a1, a2, …,

nodejs路由动态获取前台传递地址--实现查看功能

偶尔善良 提交于 2020-01-31 22:54:39
node.js动态获取路由的url地址 研究了将近一个小时,终于是通过一个另辟蹊径的方法解决了这个问题 — 用得是字符串的一些列操作,比较麻烦,我相信一定有更好的方法。 哈哈不说了 直接上图! 首先 这个页面上的内容我是连接了mysql数据库 通过nodejs路由让其显示在页面上 在HTML标签中的a标签地址动态添加索引 在最后判断传递过来的url地址是否含有getone 如果含有再通过charAt()方法获取字符串的最后一个字符就是他的索引 最后再 根据索引把数据库的内容显示在页面上 哈哈 第一次写博客,如果大家有看到,并且有更好的办法一定要告诉我哈~~~ 我会努力的 来源: CSDN 作者: weixin_46240162 链接: https://blog.csdn.net/weixin_46240162/article/details/104122032

mysql中EXPLAIN 的作用

落爺英雄遲暮 提交于 2020-01-30 18:53:50
(一)id列: (1)、id 相同执行顺序由上到下 mysql> explain -> SELECT*FROM tb_order tb1 -> LEFT JOIN tb_product tb2 ON tb1.tb_product_id = tb2.id -> LEFT JOIN tb_user tb3 ON tb1.tb_user_id = tb3.id; +----+-------------+-------+--------+---------------+---------+---------+---------------------------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+--------+---------------+---------+---------+---------------------------+------+-------+ | 1 | SIMPLE | tb1 | ALL | NULL | NULL | NULL | NULL | 1 | NULL | | 1 | SIMPLE | tb2 | eq_ref |