mysql创建索引

项目常见面试问题

亡梦爱人 提交于 2019-11-30 02:10:35
项目常见面试问题 阅读目录 项目常见面试问题 回到目录 项目常见面试问题 一、你的项目中缓存粒度是如何选择的? 缓存粒度一共分为4种. 1.缓存某个数值:一个键只保存一个值,性价比较低,使用率低,如果存储的话我们使用redis的String 2.缓存数据对象:数据库记录对应的具体数据,优点是可以多次复用,String,hash 3.缓存数据集合:数据库查询对应的结果集,可以和数据对象配合使用,方便数据对象的重用,hash,list,set,zset,String(zset,String) 4.缓存试图响应:试图返回的相应数据,复用性比较差,String 所以我们项目中主要对数据集合+数据对象进行缓存,他们的优点是复用性强,节省内存空间. 二、使用过redis的那些格式做过缓存,其他应用场景和优缺点是什么? 包括list,zset,set,hash和json字符串 其中我们使用过json字符串和zset set用来存放无序去重的数据, 如果有判断是否存在的需求 zset有排序的需要list,如果说是按时间查询, 查询的结果固定, 不需要分页的情况下,我们使用list因为查询的比较快 但如果有额外排序要求, 而且需要分页, 我们使用zset(查询时间跟查询的长度和数据量有关,跟查询区别无关, 查询速度比较均衡), 增加数据效率和存储的数据量负相关,数据量越大,添加时间越长

关于数据库索引你必须要知道的

只愿长相守 提交于 2019-11-29 21:18:34
在讲索引之前我们先讲一个小事例 小波是一个图书馆A当管理员,这个图书馆所有入馆的书直接摆在了架子上,没有任何的分类和区分,小波很高兴,因为这可以节省大量的时间,但是有一天有个读者要借《Python入门到放弃》这本书,小波花了一整天把所有的书找了一遍,累的八行。 于是乎小波跳槽到了另外一家图书馆,这家图书馆就比较厉害了,所有入馆的书都要分类,并且编号放入书架,小波一开始很不开心,这太浪费时间了,但是后来有一天有个读者要借《Python入门到放弃》,小波只用了一分钟就把书找出来了。 这个例子就在影射索引的意义。 索引定义: 1、索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。 2、索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。 为什么有索引: 添加索引是为了提高数据库查询性能。用户对数据库最频繁的操作是进行数据查询。一般情况下,数据库在进行查询操作时需要对整个表进行数据搜索。当表中的数据很多时,搜索数据就需要很长的时间,这就造成了服务器的资源浪费。为了提高检索数据的能力,数据库引入了索引机制。 索引应用场景: 什么时候适合创建索引: 1、频繁要查询的字段,经常出现在where条件后面的字段

Mysql-索引

非 Y 不嫁゛ 提交于 2019-11-29 19:52:57
索引 简介 无索引的表是一组无序的行,当我们在查询表中的某条数据时,它会逐行查询去找到匹配的行, 这是一个全表扫描操作,效率很低。 用来加速查询的技术有很多,其中最为重要的就是索引,通常情况下,查询速度差异的最大因素 就是索引的使用是否得当。此外需要注意,有些查询的编写方法会阻碍你对索引的有效利用。 索引提高效率的做法 1)可以知道匹配行在什么位置结束,可以跳过其余的部分 2)利用定位算法,不用从索引开始位置进行线性扫描即可找到匹配项,比如二分法 为什么不直接对数据排序,省掉索引操作? 分析:   直接对数据排序,省掉索引的操作也能加快数据检索的速度             V   如果表中只有一个索引,那么这是肯定的             V   但是如果你还想添加第二个索引,同时按两种方式对数据进行排序   比如,一个有关客户名字的索引,一个有关客户电话号码的索引             V   将索引从数据行中分离出来便可解决这个问题,而且还可以创建多个索引             V   索引里的数据通常比表中的数据行更短,当对索引增删值时,为保持排序顺序,   来回移动索引的较短的索引值比移动较长的数据行更加容易 案例:有索引和无索引的查询分析 假设,你有3个无索引表,t1,t2和t3,其中每个表都包含一个列,分别为i1,i2和i3,并且每个列有1000行,包含的是1

Centos7 Docker安装mysql5.7

本小妞迷上赌 提交于 2019-11-29 19:11:19
Centos7 Docker安装mysql5.7,当然版本可以自定义,这里只是本人当前用的是5.7的。 1、拉取mysql5.7镜像 docker pull docker.io/mysql:5.7 2、拉取之后可以看到 docker images -a 3、下面为mysql容器运行创建挂载目录 mkdir -p /test/mysql/data //用于存放mysql数据备份 chmod -R 777 mysql //对当前目录进行授权,否则运行镜像后会发现statu 状态为exited mkdir -p /test/mysql/conf //用于存放mysql的主配置文件如 my.cnf mkdir -p /test/mysql/logs //用于存放mysql运行日志 4、进入本地 /test/mysql/conf目录中 touch my.cnf //创建mysql的住配置文件,然后填入配置的内容就好了 参考内容如下: [client] port = 3306 socket = /tmp/mysql.sock [mysqld] port = 3306 socket = /tmp/mysql.sock basedir = /usr/local/mysql datadir = /data/mysql pid-file = /data/mysql/mysql.pid user =

mysql优化实战(explain&&索引)

痞子三分冷 提交于 2019-11-29 18:58:02
实验环境: 1、sql工具:Navicat 2、sql 数据库 ,使用openstack数据库作为示例 一、mysql索引查询 show index from instances Table:数据库表名 Non_unique:索引不能包括重复词,则为0。可以,则为1。 Key_name:索引的名称。 索引中的列序列号,从1开始。 列名称 列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。 索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机 会就越大。 如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。 指示关键字如何被压缩。如果没有被压缩,则为NULL。 如果列含有NULL,则为YES。如果没有,则该列为NO。 用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。 Comment:注释。 二、验证Mysql的主键会自动创建索引? 创建一个没有主键的ttx_index数据库表: EXPLAIN SELECT * FROM instances table:显示这一行的数据是关于哪张表的 type:这是重要的列

mysql数据库优化概述详解

十年热恋 提交于 2019-11-29 18:05:09
mysql查询的过程图 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计数据库时:数据库表、字段的设计,存储引擎 利用好MySQL自身提供的功能,如索引等 横向扩展:MySQL集群、负载均衡、读写分离 SQL语句的优化(收效甚微) 一、字段设计阶段 选取最适用的字段属性 1. 字段的宽度设得尽可能小 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。 2. 尽量把字段设置为NOTNULL 在可能的情况下,应该尽量把字段设置为NOTNULL,这样在将来执行查询的时候,数据库不用去比较NULL值。 3. 确定数据定义为ENUM类型 对于某些文本字段,例如“省份”或者“性别”,我们可以将它们定义为ENUM类型。因为在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。这样,我们又可以提高数据库的性能。 4. 单表字段不宜过多,可以预留字段 满足业务需求的前提下二三是个字段就是极限了,可以预留字段便于扩展。 遵循数据表的设计规范 1. 第一范式(1NF) 字段值具有原子性

大数据分页方案

廉价感情. 提交于 2019-11-29 17:03:15
软件开发中,常用要用到分页、计算总数,数据量超过千万、上亿的时候,往往 count 的需要超过 1s 的执行时间,甚至 3-5s,对于一个追求性能的前沿团队来说,这个不能忍啊! 为什么会慢? mysql 会对所有符合的条件做一次扫描。 select count(*) from table_a where a = '%d' ... 如果 a=%d 的数据有 1000W 条,那么数据库就会扫描一次 1000W 条数据库。如果不带查询条件,那这种全表扫描将更可怕。 count(*) 和 count(1)、count(0) count(expr) 为统计 expr 不为空的记录 count(*) 它会计算总行数,不管你字段是否有值都会列入计算范围。 coount(0),count(1) 没有差别,它会计算总行数 Example 1: mysql> explain extended select count(*) from user; ... 1 row in set, 1 warning (0.34 sec) mysql> show warnings; +-------+------+--------------------------------------------------+ | Level | Code | Message | +-------+------+---------

MySQL 索引选择原则分析(一)

心已入冬 提交于 2019-11-29 17:02:51
目的 数据库中很重要的设计一部分,莫过于索引了。 B+树索引是 MySQL中设计的索引。B+树索引是基于B+树基础发展而来的。 然而,在理解了B+树索引结构以后,对优化SQL会事 半 功 倍 。还针对前面 MySQL索引选择规则 文章做进一步分析。 1:B+树 与 B+树索引 区别 B+树 B+树索引 存储位置 内存 磁盘 扇出率 低 高 并发控制 可以不考虑 需要考虑 分裂方向 不需要考虑 向左、向右 上图中列出两者的区别,光看图片可能不能理解每个区别对应的含义。 下面就来分析一下重要的区别: 1.1:存储位置: B+树 是为磁盘或其他直接存取辅助设备而设计的一种平衡查找树,因此主要操作是计算不需要文件来存储,也就是在内存来操作的。 B+树索引 是基于磁盘,因此数据库会出现索引文件,索引文件就是存储在磁盘上的。 1.2:分裂方向 B+树 是内存结构,不需要考虑页分裂的方向。 B+树索引 在磁盘上,为了充分利用磁盘的顺序特性,还需要根据不同插入情况考虑不同的分裂点记录以及分裂的方向。 2:MySQL的InnoDB存储引擎的索引设计 InnoDB存储引擎将B+树索引分为聚集索引和辅助索引。 聚集索引是通过将表的主键作为键值来构造B+树。如果没有显示创建,自动创建一个6字节的主键。聚集索引还包含记录所有列信息。 2.1:存储结构 聚集索引的非叶子点存放的是<键值, 地址>

mysql锁

回眸只為那壹抹淺笑 提交于 2019-11-29 16:52:57
原文链接: http://blog.csdn.net/soonfly/article/details/70238902 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的 计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。本章我们着重讨论MySQL锁机制 的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议。 Mysql用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。这些锁统称为悲观锁(Pessimistic Lock)。 MySQL锁概述 相对其他数据库而言,MySQL的锁机制比较简单,其最 显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

MySQL Explain学习笔记

时光总嘲笑我的痴心妄想 提交于 2019-11-29 16:39:58
目录 一、执行计划概念 二、Explain用法 三、Explain属性介绍 3.1 id属性 3.2 select_type属性 3.3 table属性 3.4 type属性 3.5 possible_keys属性 3.6 key属性 3.7 key_len属性 3.8 ref属性 3.9 rows属性 3.10 Extra属性 继上一篇博客 《MySQL的索引知识学习笔记》 之后,我再记录一篇MySQL执行计划方面的博客,本博客是我在学习尚硅谷的学习教程后,做的笔记,当然我不是为了所谓宣传,仅仅是学习记录的笔记。本来可以不分享出来,不过,分享出来的笔记不仅可以给网上的学习者参考学习,同时写在csdn比较方便,可以支持图片上传,也方便自己以后查找复习 附录:我创建的数据库方面的专栏 SQL调优方面的专栏 MySQL知识方面的专栏 @ 一、执行计划概念 执行计划(Explain):explain显示了mysql如何使用索引来处理select语句以及连接表,使用Explain关键字可以模拟MySQL优化器执行SQL查询语句,从而知道MySQL是如何处理SQL语句的。所以执行计划常用于SQL调优 二、Explain用法 Explain的用法: Explain + SQL语句 mysql> explain select * from sys_user; mysql> use