mysql创建索引

python后端面试第三部分:数据储存与缓存相关--长期维护

感情迁移 提交于 2020-01-22 15:34:57
################## 数据储存与缓存相关 ####################### mysql数据库, redis数据库, 9. MySQL的索引一般是怎么实现的? B-Tree(一般是B+Tree)和Hash,然后再简单介绍一下。 存储 存储可能包含rdbms,nosql以及缓存等,我以MySQL,redis举例。 mysql相关 mysql 是流行的RDBMS 关系型数据库 1.谈谈mysql字符集和排序规则? 2.var char与char的区别是什么?大小限制?utf8字符集下varchar最多能存多少个字符 char的长度是不可变的,而varchar的长度是可变的,也就是说,定义一个char[10]和varchar[10],如果存进去的是‘csdn’,那么char所占的长度依然为10, 除了字符‘csdn’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的。 尽管如此,char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的。 再者,char的存储方式是,对英文字符

MySQL高级---索引优化分析(三、索引简介)

偶尔善良 提交于 2020-01-22 02:47:01
1、索引的概念 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。可以得到索引的本质: 索引是数据结构 。可以简单理解为 排好序的快速查找数据结构 。 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。 2、下图就是一种可能的索引方式示例: 左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址。为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在一定的复杂度内获取到相应数据,从而快速的检索出符合条件的记录。 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。我们平时说的索引,进入没有特别指明,都是指B树(多路搜索树,并不一定是二叉的)结构组织的索引,其中狙击符合索引,前缀索引,唯一索引默认都是使用的B+树索引,统称索引。 3、优缺点 优势: 1、类似于大学的图书馆里建书目索引,提高数据检索的效率,降低数据库的IO成本。 2、通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。 劣势: 1、虽然索引大大 提高了查询速度 ,同时却会 降低更新表的速度 ,如对表进行INSERT

MySql数据库优化

…衆ロ難τιáo~ 提交于 2020-01-21 14:05:44
数据库优化,是一种综合性的技术,不是通过某一种方式让数据库效率提高很多,而是通过各个方面的优化,来是数据库效率明显的稳步的提高。 主要包括以下: 1、库表的设计优化(三种范式) 2、 库表添加合适的索引(普通索引+主键索引+唯一索引+全文索引) 3、 分表技术-水平分割与垂直分割 4、 读写分离(add/delete/update与select分开) 5、 多用存储过程和触发器(模块化编程) 6、 优化MqSql配置(配置最大并发数,调整缓存大小,my.ini) 7、SQL优化与慢查询 8、 定时清楚垃圾数据,定时进行碎片整理( MyISAM ) 除此之外,还有 MqSql服务器硬件升级 以下进行详细描述 题外话: 存储引擎: MyISAM : 查询速度快,插入速度快,但不支持 事务 ,碎片多; InnoDB :5.5版本后Mysql的默认数据库,支持事务,支持ACID事务,支持行级锁定; Memory :所有数据置于内存中,拥有极高的插入,适合频繁的数据更新,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在Mysql重新启动时丢失,不需要保存滴; 数据库三种模式结构/三级模式 外模式(用户):用户所能看到的数据视图,可通过数据库操纵语言对数据进行操作; 模式(概念):用户视图的最小并集,所有数据的逻辑结构和概念的描述; 内模式(物理):实际存储组合,内部视图

MySQL SQL优化

匆匆过客 提交于 2020-01-20 15:47:38
SQL优化大全 索引优化 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。 4.应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num=10 or num=20可以这样查询:select id from t where num=10 union all select id from t where num=20 http://5.in 和 not in 也要慎用,否则会导致全表扫描,如:select id from t where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了:select id from t where num between 1 and 3 6

MySQL数据库索引的4大类型以及相关的索引创建

一曲冷凌霜 提交于 2020-01-19 23:21:24
此文章主要描述的是MySQL数据库索引类型其主要是可以分成4大类型,以及对MySQL数据库索引类型的实际应用与创建有相关的介绍。 以下的文章主要介绍的是 MySQL 数据库索引类型,其中包括普通索引,唯一索引,主键索引与主键索引,以及对这些索引的实际应用或是创建有一个详细介绍,以下就是文章的主要内容描述。 ( 1 )普通索引 这是最基本的MySQL数据库索引,它没有任何限制。它有以下几种创建方式: 创建索引 CREATE INDEX indexName ON mytable(username(length)); 如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同。 修改表结构 ALTER mytable ADD INDEX [indexName] ON (username(length)) 创建表的时候直接指定 CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) ); 删除索引的语法: DROP INDEX [indexName] ON mytable; ( 2 )唯一索引 它与前面的普通索引类似,不同的就是:MySQL数据库索引列的值必须唯一

mysql基础篇-引擎区别

孤人 提交于 2020-01-19 19:33:00
引擎是什么? MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。 在文件系统中,MySQL将每个数据库(也可以称之为schema)保存为数据目录下的一个子目录。创建表时,MySQL会在数据库子目录下创建一个和表同名的.frm文件保存表的定义。例如创建一个名为 MyTable的表,MySQL会在MyTable.frm文件中保存该表的定义。 因为MySQL使用文件系统的目录和文件来保存数据库和表的定义,大小写敏感性和具体的平台密切相关。在Windows中,大小写是不敏感的;而在类Unix中则是敏感的。不同的存储引擎保存数据和索引的方式是不同的,但表的定义则是在MySQL服务层统一处理的。 查看引擎 show engines; Engine Support Comment Transactions XA Save point InnoDB DEFAULT Supports transactions, row-level locking, and foreign keys YES YES YES MRG_MYISAM YES Collection of identical MyISAM tables NO

PostgreSQL简介

别等时光非礼了梦想. 提交于 2020-01-18 23:14:51
PostgreSQL 是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它在其他开放源代码数据库系统(比如 MySQL 和 Firebird),和专有系统比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server之外,为用户又提供了一种选择。 PostgreSQL 不寻常的名字导致一些读者停下来尝试拼读它,特别是那些把SQL拼读为"sequel"的人。PostgreSQL 开发者把它拼读为 "post-gress-Q-L"。(Audio sample,5.6k MP3)。它也经常被简略唸为 "postgres"。 历史 PostgreSQL 经历了长时间的演变,开始于在 UC Berkeley 的 Ingres 计划。这个计划的领导者 Michael Stonebraker 在1982年离开 Berkeley 去商业化 Ingres,但是最后还是返回了学术界。在1985年返回 Berkeley 之后,Stonebraker 开始了 post-Ingres 计划来致力于在 1980 年代早期变得日益清楚的、当代数据库系统的问题。Postgres 和 Ingres 的代码库开始(并保持)完全分离了。 结果的计划叫 Postgres ,目标是介入增加对类型的完全支持所需要的最小数目的特征

第五章-索引与算法

别等时光非礼了梦想. 提交于 2020-01-18 02:17:31
5.1 InnoDB存储引擎索引概述 183 InnoDB存储引擎支持以下几种常见的索引: B+树索引 全文索引 哈希索引 InnoDB 存储引擎支持的哈希索引是自适应的,InnoDB 存储引擎会根据表的使用情况自动为表生成哈希索引,不能人为干预是否在一张表中生成哈希索引。 B+树索引目前关系型数据库系统中查找最为常用和最为有效的索引。 B+树索引并不能找到一个给定键值的具体行,只能找到对应的页,然后把页读到内存,再在内存中进行查找。 5.2 数据结构与算法 184 5.2.1 二分查找法 184 5.2.2 二叉查找树和平衡二叉树 185 5.3 B+树 187 5.3.1 B+树的插入操作 187 5.3.2 B+树的删除操作 190 5.4 B+树索引 191 根据叶子节点存放的是否是一整行的信息,可将数据库中的B+树索引分为聚集索引(clustered inex)和辅助索引(非聚集索引)(secondary index) 5.4.1 聚集索引 192 聚集索引(clustered index)就是按照每张表的主键构造一棵 B+树,同时叶子节点中存放的即为表的行记录数据(所有叶子节点加起来就是整张表的行记录数据),也将聚集索引的叶子节点称为数据页。 聚集索引的存储并不是物理上连续的,而是逻辑上连续的。 5.4.2 辅助索引 196 对于辅助索引(Secondary Index

python操作mongodb数据库

和自甴很熟 提交于 2020-01-17 19:05:34
一、MongoDB 数据库操作 连接数据库 import pymongo conn = pymongo.Connection() # 连接本机数据库 conn = pymongo.Connection(host=“192.168.1.202”) # 连接指定IP的数据库db = conn.test # 进入指定名称的数据库 然而,本人电脑所用软件为python2.7,在用pymongo.Connection()连接数据库时总是报错,后改为pymongo.MongoClient()连接则成功,代码如下。 def connect(self): self.conn = pymongo.MongoClient(host="localhost",port=27017) print '~~~' users = db.users # 获取数据库里的 users 集合 users = db['users'] # 获取数据库里的 users 集合,也可以用字典来获取 db.collection_names()#查看数据库里所以的表 插入 u = dict(name = “user1”, age = 23) db.users.save(u) # 用 save 也可以插入 db.users.insert(u) # 将数据插入到 users 集合 更新 更新指定一条记录 u2 = db.users

mysql调优之索引——ORDER BY(GROUP BY)

别说谁变了你拦得住时间么 提交于 2020-01-17 19:03:45
order by 的排序优化 1、 ORDER BY 子句尽量使用index方式排序,避免使用filesort方式排序。 2、ORDER BY 满足两种方式会使用index方式排序: order by使用索引最左前列 使用where 子句与order by 子句条件列组合满足索引最左前列 3、如果不在索引列上,filesort有两种算法,mysql就要启动双路和单路排序. 双路排序 (1)mysql4.1之前是使用双路排序,两次扫描磁盘,最终得到数据,读取行指针和order by列,对他们进行排序,然后扫描已经排好序的列表,按照列表中的值重新从数据库列表中读取对应的数据输出。 (2)从磁盘读取字段,在buffer中进行排序,再从磁盘取其他字段。 (3)取一批数据,要扫描两次磁盘,进行两次I/O操作,由于I/O操作很耗时,索引在4.1之后采用另一种算法,单路排序。 单路排序 从磁盘中读取查询所需要的列,按照order by列在buffer进行排序,然后扫描排序后的列表进行输出,它的效率更高一点,避免了第二次读取数据。并且随机I/O变成了顺序I/O,但是它会使用更大的内存空间,因为它把数据都保存在内存当中。 注意 在sort buffer中,单路排序比双路排序使用了更多的内存空间,因为单路排序把所有字段都取出,所有有可能导致取出的数据总大小超出sort_buffer的容量