mysql索引优化面试题

mysql索引优化面试题
mysql索引优化面试题

mysql索引优化面试题

问题:mysql索引优化面试题回答:

曾经偷偷的面试了两个单位,都提到了Mysql的优化问题,所以以后要多多学习数据库的优化知识了。建设数据库的优化大概主要就是索引的优化了吧,因为我们不可能修改数据结构的情况下,提高数据库的查询效率似乎也只能用索引了。当然这也是建立在你sql语句写的比较科学的情况下,如果你的sql语句本身就写的比较垃圾,神仙也救不了你!

下边是在网上找到的一些资料,保留下来备用吧

1,创建索引

对于查询占主要的应用来说,索引显得尤为重要。很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致。如果不加索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,如果一张表的数据量很大而符合条件的结果又很少,那么不加索引会引起致命的性能下降。但是也不是什么情况都非得建索引不可,比如性别可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引。

2,复合索引

比如有一条语句是这样的:select * from users where area=’beijing’and age=22;

如果我们是在area和age上分别创建单个索引的话,由于mysql查询每次只能使用一个索引,所以虽然这样已经相对不做索引时全表扫描提高了很多效率,但是如果在area、age两列上创建复合索引的话将带来更高的效率。如果我们创建了(area, age, salary)的复合索引,那么其实相当于创建了(area,age,salary)、(area,age)、(area)三个索引,这被称为最佳左前缀特性。因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。

3,索引不会包含有NULL值的列

只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。

4,使用短索引

对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。

5,排序的索引问题

mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。

6,like语句操作

一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%”不会使用索引而like “aaa%”可以使用索引。

7,不要在列上进行运算

select * from users where YEAR(adddate)

将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成

select * from users where adddate

8,不使用NOT IN和操作

NOT IN和操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替,id3则可使用id>3 or id

mysql数据库索引优化

我们首先讨论索引,因为它是加快查询的最重要的工具。还有其他加快查询的[url=javascript:;]技术[/url],但是最有效的莫过于恰当地使用索引了。在MySQL 的邮件清单上,人们通常询问关于使查询更快的问题。在大量的案例中,都是因为表上没有索引,一般只要加上索引就可以立即解决问题。但这样也并非总是有效,因为优化并非总是那样简单。然而,如果不使用索引,在许多情形下,用其他手段改善性能只会是浪费时间。应该首先考虑使用索引取得最大的性能改善,然后再寻求其他可能有帮助的技术。 本节介绍索引是什么、它怎样改善查询性能、索引在什么情况下可能会降低性能,以及怎样为表选择索引。下一节,我们将讨论MySQL 的查询优化程序。除了知道怎样创建索引外,了解一些优化程序的知识也是有好处的,因为这样可以更好地利用所创建的索引。某些编写查询的方法实际上会妨碍索引的效果,应该避免这种情况出现。(虽然并非总会这样。有时也会希望忽略优化程序的作用。我们也将介绍这些情况。) 索引对单个表查询的影响 索引被用来快速找出在一个列上用一特定值的行。没有索引,MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行。表越大,花费时间越多。如果表对于查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要考虑所有数据。如果一个表有1000 行,这比顺序读取至少快100倍。注意你需要存取几乎所有1000行,它较快的顺序读取,因为此时我们避免磁盘寻道。 例如对下面这样的一个student表: mysql>SELECT * FROM student +------+---------+---------+---------+---------+ | id | name | english | chinese | history | +------+---------+---------+---------+---------+ | 12 | Tom | 66 | 93 | 67 | | 56 | Paul | 78 | 52 | 75 | | 10 | Marry | 54 | 89 | 74 | | 4 | Tina | 99 | 83 | 48 | | 39 | William | 43 | 96 | 52 | | 74 | Stone | 42 | 40 | 61 | | 86 | Smith | 49 | 85 | 78 | | 37 | Black | 49 | 63 | 47 | | 89 | White | 94 | 31 | 52 | +------+---------+---------+---------+---------+ 这样,我们试图对它进行一个特定查询时,就不得不做一个全表的扫描,速度很慢。例如,我们查找出所有english成绩不及格的学生: mysql>SELECT name,english FROM student WHERE english<60; +---------+---------+ | name | english | +---------+---------+ | Marry | 54 | | William | 43 | | Stone | 42 | | Smith | 49 |

mysql面试大全精心整理

Mysl面试大全 1.Mysql中有哪几种锁? 1.表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 2.行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 3. 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。 2.Mysql中有哪些不同的表格? 共有5种类型的表格: MyISAM Heap Merge INNODB ISAM 3.简述在MySQL数据库中MyISAM和InnoDB的区别 MyISAM: 不支持事务,但是每次查询都是原子的; 支持表级锁,即每次操作是对整个表加锁; 存储表的总行数; 一个MYISAM表有三个文件:索引文件、表结构文件、数据文件; 采用菲聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性。 InnoDb: 支持ACID的事务,支持事务的四种隔离级别; 支持行级锁及外键约束:因此可以支持写并发; 不存储总行数; 一个InnoDb引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里),也有可能为多个(设置为独立表空,表大小受操作系统文件大小限制,一般为2G),受操作系统文件大小的限制; 主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。 4.Mysql中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别? SQL标准定义的四个隔离级别为: read uncommited :读到未提交数据 read committed:脏读,不可重复读 repeatable read:可重读 serializable :串行事物

MySQL数据库考试试题及答案

专业:移动通信科目:MySQL数据库 一、单项选择题 1.以下聚合函数求数据总和的是( ) A.MAX B.SUM C.COUNT D.AVG 答案:B 2.可以用( )来声明游标 A.CREATE CURSOR B.ALTER CURSOR C.SET CURSOR D.DECLARE CURSOR 答案:D 3.SELECT语句的完整语法较复杂,但至少包括的部分是( ) A.仅SELECT B.SELECT,FROM C.SELECT,GROUP D.SELECT,INTO 答案:B 4.SQL语句中的条件用以下哪一项来表达( ) A.THEN B.WHILE C.WHERE D.IF 答案:C 5.使用CREATE TABLE语句的( )子句,在创建基本表时可以启用全文本搜索A.FULLTEXT B.ENGINE C.FROM D.WHRER 答案:A 6.以下能够删除一列的是( ) A.alter table emp remove addcolumn B.alter table emp drop column addcolumn C.alter table emp delete column addcolumn D.alter table emp delete addcolumn 答案:B 7.若要撤销数据库中已经存在的表S,可用()。 A.DELETE TABLE S B.DELETE S C.DROP S D.DROP TABLE S 答案:D

8.查找表结构用以下哪一项( ) A.FIND B.SELETE C.ALTER D.DESC 答案:D 9.要得到最后一句SELECT查询到的总行数,可以使用的函数是( ) A.FOUND_ROWS B.LAST_ROWS C.ROW_COUNT D.LAST_INSERT_ID 答案:A 10.在视图上不能完成的操作是( ) A.查询 B.在视图上定义新的视图 C.更新视图 D.在视图上定义新的表 答案:D 11.UNIQUE惟一索引的作用是( ) A.保证各行在该索引上的值都不得重复 B.保证各行在该索引上的值不得为NULL C.保证参加惟一索引的各列,不得再参加其他的索引 D.保证惟一索引不能被删除 答案:A 12.用于将事务处理写到数据库的命令是( ) A.insert B.rollback C.commit D.savepoint 答案:C 13.查找条件为:姓名不是NULL的记录( ) A.WHERE NAME ! NULL B.WHERE NAME NOT NULL C.WHERE NAME IS NOT NULL D.WHERE NAME!=NULL 答案:C 14.主键的建立有( )种方法 A.一 B.四 C.二 D.三 答案:D 15.在视图上不能完成的操作是( ) A.更新视图数据

如何优化数据库,提高查询效率

龙源期刊网 https://www.360docs.net/doc/a111206918.html, 如何优化数据库,提高查询效率 作者:代鸿彬 来源:《学习与科普》2019年第10期 摘要:随着信息时代的到来,生活和工作当中已经无法避免的需要和计算机打交道,和 计算机打交道的同时就必须要用到数据库。数据库系统是计算机当中的一项重要系统,储存在用户的关键信息,不仅对个人影响很大,同时对企事业单位也有着重要影响。 关键词:信息时代;数据库;索引 数据库是信息的载体也是数据的最佳表现形式,它的共享性导致了数据会被大量的搜索查询,为了提高查询的效率,就不得不对数据库进行优化。 一、利用索引进行优化。 索引是数据库的重要组成部分,也是使用者根据需要进行查询最直接的方法,优化索引可以提高查询的效率。当前的数据库当中大部分还是使用国际商业机器公司以前的索引顺序存取方法,对于用户来说肯定会选择方便、快捷的索引方式,怎么方便怎么来。在建立索引的时候针对不同的内容,需要建立不同的连接方式,但是随着用户的增多,查询内容和方向的多元化,这就造成了在实际工作当中经常会有使用频率很少的索引出现,甚至也会出现没有查询所需的索引,这种情况可以通过查询优化器进行自动生成的索引进行查询。对于使用频率较为频繁的列,需要对其进行排序或者分组的列上建立索引时,要优化索引提高效率,对于使用频率很少的列可以不建立索引。 二、简化排序进行优化。 对于部分企事业单位需要排序的内容很多时,就要使用大型数据表来满足查询需求,但是大型数据表涉及的内容很多,为了避免出现重复排序的现象需要对数据表进行简化。在大型数据表当中有一部分的内容可以自动进行排序的次序输出,这时就可以直接利用查询优化器进行优化,将复杂的排序简单化,从而提高索引查询效率。需要排序的列对索引优化影响较大,就像语言当中的ORDER BY 或者GROUP BY句子当中的列次序和索引当中的列次序基本是不同的,但是排序的列可通过表的不同形式表现出来。通过简化排序避免了重复的排序,并且将数据库进行了合理的合并。如果不进行简化排序,就需要将排序的范围进行缩小简化,从而提高查询使用的效率。 三、大型表行数据库存取的合理消除。 数据库系统的存储量是有上限的,所有的索引内容都占有数据库空间,尤其是大型数据表占有的空间更大,将会造成索引时间变长。但是大型表行数据有些内容是不必要的,在进行索引查詢时,数据表当中的存取顺序对查询的效率有直接的影响。例如需要采用存取策略时,通

mysql数据库面试题

公司招聘MySQL DBA面试心得 2013-11-01 10:06:51 我来说两句作者:黄杉 收藏我要投稿公司招聘MySQL DBA面试心得 1 2年MySQL DBA经验 其中许多有水分,一看到简历自我介绍,说公司项目的时候,会写上linux 系统维护,mssql server项目,或者oracle data gard项目,一般如果有这些的话,工作在3年到4年的话,他的2年MySQL DBA管理经验,是有很大的水分的。刚开始我跟领导说,这些不用去面试了,肯定mysql dba经验不足,领导说先面面看看,于是我就面了,结果很多人卡在基础知识这一环节之上,比如: (1)有的卡在复制原理之上 (2)有的卡在binlog的日志格式的种类和分别 (3)有的卡在innodb事务与日志的实现上。 (4)有的卡在innodb与myisam的索引实现方式的理解上面。 ......... 个人觉得如果有过真正的2年mysql专职dba经验,那么肯定会在mysql的基本原理上有所研究,因为很多问题都不得不让你去仔细研究各种细节,而自己研究过的细节肯定会记忆深刻,别人问起一定会说的头头是道,起码一些最基本的关键参数比如Seconds_Behind_Master为60这个值60的准确涵义,面试了10+的mysql dba,没有一个说的准确,有的说不知道忘记了,有的说是差了60秒,有的说是与主上执行时间延后了60秒。 2 对于简历中写有熟悉mysql高可用方案 我一般先问他现在管理的数据库架构是什么,如果他只说出了主从,而没有说任何ha的方案,那么我就可以判断出他没有实际的ha经验。不过这时候也不能就是断定他不懂mysql高可用,也许是没有实际机会去使用,那么我就要问mmm以及mha以及mm+keepalived等的原理实现方式以及它们之间的优势和不足了,一般这种情况下,能说出这个的基本没有。 3 对于简历中写有批量MySQL 数据库服务器的管理经验

mysql 面试题(简单)

数据库入门[mysql] 1、假设要按照分页(每页显示10条)的形式获取test表中的数据,在MySql数据库中,以下哪条语句是取第2页中的数据?(单选) (难度A) A、select * from test limit 10,10; B、select * from test limit 11,10; C、select * from test limit 10,20; D、select * from test limit 11,20; 2在Mysql数据库中,以下哪条语句用于统计test表中的记录总数?(难度A) A、select sum(*) from test; B、select max(*) from test; C、select avg(*) from test; D、select count(*) from test; E、select min(*) from test; 3、假设在D盘根目录下有一个名为db.sql的文件,以下哪些语句可以利用db.sql恢复数据库test(数据库名已经存在)中的表结构和数据?(难度A) A、在DOS提示符下输入以下命令 mysql -uroot -p1234 testd:/db.sql 4、下列SQL语句中,创建关系表的是?(难度A) A、ALTER B、CREATE C、UPDATE D、INSERT 5、以下那个不是DDL(数据定义语言)保留的关键字?(难度A) A、CREATE B、DELETE C、ALTER D、DROP 6、以下哪个sql语句表示在mysql中创建book表,并添加id字段和title字段?(难度A) A、create table book{ id varchar(32), title varchar(50) }; B、create table book( id varchar2(32), title varchar2(50) );

SQLSERVER索引及优化详解

SqlServer索引及优化详解 (一)深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。下面,我们举例来说明一下聚集索引和非聚集索引的区别:其实,我们的汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部。如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;同样的,如果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼音是“zhang”。也就是说,字典的正文部分本身就是一个目录,您不需要再去查其他目录来找到您需要找的内容。 我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。如果您认识某个字,您可以快速地从自动中查到这个字。但您也可能会遇到您不认识的字,不知道它的发音,这时候,您就不能按照刚才的方法找到您要查的字,而需要去根据“偏旁部首”查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“张”字,我们可以看到在查部首之后的检字表中“张”的页码是672页,检字表中“张”的上面是“驰”字,但页码却是63页,“张”的下面是“弩”字,页面是390页。很显然,这些字并不是真正的分别位于“张”字的上下方,现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后再翻到您所需要的页码。我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。通过以上例子,我们可以理解到什么是“聚集索引”和“非聚集索引”。进一步引申一下,我们可以很容易的理解:每个表只能有一个聚集索引,因为目录只能按照一种方法进行排序。 (二)何时使用聚集索引或非聚集索引 下面的表总结了何时使用聚集索引或非聚集索引(很重要)。

MySQL优化自学手册

/* * ------------------------------------------------------------------- * |-标题:MySQL优化自学手册 * |-整理: 杨白玉 * |-时间: 2015年9月25日 * ------------------------------------------------------------------- */ mysql优化 前提:数据库性能的优劣直接影响到程序的性能,所以数据库的设计与参数配置至关重要。 数据库优化的方式: 1、数据库设计 2、sql语句的优化 3、数据库参数的配置(扩展数据库的缓存或者数据库的空间) 4、恰当的硬件资源(钱的问题,有钱就能满足)

第一章数据库的设计 一、数据库的设计: 数据库的设计指的就是表的设计。设计要符合三范式(规范的模式),有时我们也需要适当的逆范式; 二、什么是三范式? 第一范式:1NF是对属性(可理解为字段)的原子性约束,要求属性具有原子性,不可再分。第二范式:2NF是对记录的唯一性约束,要求记录有唯一的标识,即实体的唯一性; 第三范式:3NF是对字段冗余的约束,即任何字段不能由其他字段派生出来,要求字段没有冗余,这是可以做到的。 然而,没有冗余的数据库未必是好的数据库,有时候为了提高运行的效率,我们也会使用适当的逆范式,方法就是:增加字段。 一般来说,1NF在关系型数据库中是自动满足的; 2NF通常通过主键自增的唯一性来约束。而且,记录本身也很少会完全一样; 3NF主要是在主从表中,不会出现相同的字段与字段值;

第二章 SQL语句的优化 一、SQL语句优化的步骤: 1、通过show status 命令了解各种sql的执行频率; 2、定位执行效率较低的SQL语句,主要集中在查询语句 3、通过explain分析低效率的sql语句的执行情况 4、确定问题并采取相应的优化措施 二、sql语句有几类? ddl(数据定义语句)[create alter drop] dml(数据操作语句)[insert delete update] select dtl(数据事物语句)[commit rollback savepoint] dcl(数据控制语句)[grant revoke] show status命令 该命令可以显示mysql数据库当前的状态,我们主要重点关注“Com”开头的指令。 1、显示数据库开启本次会话后到目前的信息: show status like “Com%”; <=> show session status like “Com%”; 2、显示数据库从启动到目前的信息: Show global status like “Com%”;

运维面试题(含答案)

运维工程师面试题 姓名: 答题时间: 1.新安装MYSQL后怎样提升MYSQL的安全级别? A.修改mysql默认端口 B.linux下可以通过iptables来限制访问mysql端口的IP地址 C.对所有用户设置较复杂密码并严格指定对应账号的访问IP(可在mysql库 中user表中指定用户的访问可访问IP地址) D.root特权账号的处理(建议给root账号设置强密码,并指定只允许本地登录) E.开启二进制查询日志和慢查询日志 F.mysql安装目录及数据存储目录权限控制:给mysql安装目录读取权限,给mysql日志和数据所在目录读取和写入权限 G.删除无用mysql账号和删除无用的数据库(安装好的mysql默认会有个 test库,可将其删除) 2.MYSQL的主从原理,怎么配置文件? 整体上来说,复制有3个步骤: A.master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日 志事件,binary log events); B.slave将master的binary log events拷贝到它的中继日志(relay log);

C.slave重做中继日志中的事件,将改变反映它自己的数据。 3.mysql主从复制的优点 <1> 如果主服务器出现问题,可以快速切换到从服务器提供的服务; <2> 可以在从服务器上执行查询操作,降低主服务器的访问压力; <3> 可以在从服务器上执行备份,以避免备份期间影响主服务器的服务。 4.Mysql复制的基本原理过程 (1)Slave上面的IO线程连接上Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容; (2)Master接收到来自Slave的IO线程的请求后,通过负责复制的IO线程根据请求信息读取指定日志指定位置之后的日志信息,返回给Slave端的IO线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在Master端binary log文件的名称以及在Binary log中的位置; (3)Slave的IO线程收到信息后,将接收到的日志内容依次写入到Slave端的RelayLog 文件(mysql-relay-lin.xxxxx)的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我” (4)Slave的SQL线程检测到Relay Log中新增加了内容后,会马上解析该Log 文件中的内容成为在Master端真实执行时候的那些可执行的查询或操作语句,并在自身执行那些查询或操作语句,这样,实际上就是在master端和Slave端执行了同样的查询或操作语句,所以两端的数据是完全一样的。

MySQL常见面试题

1. 什么是索引? 索引是一种数据结构,可以帮助我们快速的进行数据的查找。 2. 索引是个什么样的数据结构呢? 索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引。 3. Hash索引和B+树所有有什么区别或者说优劣呢? 首先要知道Hash索引和B+树索引的底层实现原理: hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据。B+树底层实现是多路平衡查找树。对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据。 那么可以看出他们有以下的不同: ?hash索引进行等值查询更快(一般情况下),但是却无法进行范围查询。 因为在hash索引中经过hash函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询。而B+树的的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围。 ?hash索引不支持使用索引进行排序,原理同上。 ?hash索引不支持模糊查询以及多列索引的最左前缀匹配。原理也是因为hash 函数的不可预测。AAAA和AAAAB的索引没有相关性。 ?hash索引任何时候都避免不了回表查询数据,而B+树在符合某些条件(聚簇索引,覆盖索引等)的时候可以只通过索引完成查询。 ?hash索引虽然在等值查询上较快,但是不稳定。性能不可预测,当某个键值存在大量重复的时候,发生hash碰撞,此时效率可能极差。而B+树的查询效率比较稳定,对于所有的查询都是从根节点到叶子节点,且树的高度较低。 因此,在大多数情况下,直接选择B+树索引可以获得稳定且较好的查询速度。而不需要使用hash索引。 4.上面提到了B+树在满足聚簇索引和覆盖索引的时候不需要回表查询数据, 什么是聚簇索引? 在B+树的索引中,叶子节点可能存储了当前的key值,也可能存储了当前的key值以及整行的数据,这就是聚簇索引和非聚簇索引。在InnoDB中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引。 如果没有唯一键,则隐式的生成一个键来建立聚簇索引。 当查询使用聚簇索引时,在对应的叶子节点,可以获取到整行数据,因此不用再次进行回表查询。 5.非聚簇索引一定会回表查询吗? 不一定,这涉及到查询语句所要求的字段是否全部命中了索引,如果全部命中了索引,那么就不必再进行回表查询。

sql优化方案讲解

Sql优化方案 一.数据库优化技术 1.索引(强烈建议使用) 1.1优点 创建索引可以大大提高系统的性能。 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。 第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 1.2 缺点 第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。 第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 1.3 使用准则 索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。 一般来说,应该在这些列上创建索引。 第一,在经常需要搜索的列上,可以加快搜索的速度;

第二,在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构; 第三,在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;第四,在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的; 第五,在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间; 第六,在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。 同样,对于有些列不应该创建索引。一般来说,不应该创建索引的的这些列具有下列特点: 第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。 第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。 第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。 第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。 1.4 总结 1)索引提高了数据库的检索性能,但一定程度上牺牲了修改性能。因此适用于“多查询少修改”(insert,update,delete)的表。 2)对此类表中的外键,需要分组,排序或作为检索条件的字段建立索引 3)对此类表中查询使用少,字段取值少,字段数据量大的不应创建索引

MYSQL索引和优化详细说明教程

MYSQL索引和优化详细说明教程 2008-05-16 15:59 MYSQL索引和优化 一、什么是索引? 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。 假设我们创建了一个名为people的表: 然后,我们完全随机把1000个不同name值插入到people表。 可以看到,在数据文件中name列没有任何明确的次序。如果我们创建了name 列的索引,MySQL将在索引中排序name列: 对于索引中的每一项,MySQL在内部为它保存一个数据文件中实际记录所在位置的“指针”。因此,如果我们要查找name等于“Mike”记录的peopleid(SQL 命令为“SELECT peopleid FROM people WHERE name=\’Mike\’;”),MySQL 能够在name的索引中查找“Mike”值,然后直接转到数据文件中相应的行,准确地返回该行的peopleid(999)。在这个过程中,MySQL只需处理一个行就可以返回结果。如果没有“name”列的索引,MySQL要扫描数据文件中的所有记录,即1000个记录!显然,需要MySQL处理的记录数量越少,则它完成任务的速度就越快。 二、索引的类型 MySQL提供多种索引类型供选择: 普通索引 这是最基本的索引类型,而且它没有唯一性之类的限制。普通索引可以通 过以下几种方式创建:

MySQL最全整理(面试题+笔记+导图),面试大厂不再被MySql难倒!

前言 作为一名编程人员,对MySQL一定不会陌生,尤其是互联网行业,对MySQL的使用是比较多的。对于求职者来说,MySQL又是面试中一定会问到的重点,很多人拥有大厂梦,却因为MySQL败下阵来。实际上,MySQL并不难,今天这份最全的MySQL总结,助你向大厂“开炮”,面试不再被MySQL难倒。 注意:关于MySQL的内容整理,包括了面试题、学习笔记、使用文档以及Xmind思维图几个部分,需要高清完整版的请转发+关注,然后私信回复“666”获得免费领取方式 01、MySQL 面试题集合总结 1.1 MySQL 面试题(基础部分): ?drop、truncate、delete区别 ?数据库三范式是什么? ?union和union all有什么不同? ?char、varchar2、varchar有什么区别? ?合并查询有哪些? ?SQL语句执行顺序 ?null的含义 ?MySQL、SqlServer、oracle写出字符存储、字符串转时间 ?update语句可以修改结果集中的数据吗? ?B树和B+树的区别 ?你建过索引吗? 建索引的原则 ?索引的类型, 如主键索引 ?查看SQL执行计划

?有十万条数据, 写SQL语句查询其中某字段较大值的几条数据 ?子查询与关联查询的区别 ?MySQL InnoDB、Mysaim的特点? ?乐观锁和悲观锁的区别?? ?行锁和表锁的区别? ?数据库隔离级别是什么?有什么作用? ?MySQL主备同步的基本原理。 ?如何优化数据库性能(索引、分库分表、批量操作、分页算法、升级硬盘SSD、业务优化、主从部署) ?SQL什么情况下不会使用索引(不包含,不等于,函数) ?一般在什么字段上建索引(过滤数据最多的字段) ?MySQL,B+索引实现,行锁实现,SQL优化 ?如何解决高并发减库存问题 ?数据库事务的几种粒度 1.2 MySQL 面试题(实战部分): ?数据库三范式,根据秒杀场景设计数据表 ?数据库的主从复制 ?死锁怎么解决 ?mysql并发情况下怎么解决(通过事务、隔离级别、锁) ?触发器的作用? ?什么是存储过程?用什么来调用? ?存储过程的优缺点?

mysql优化笔记

◆Mysql数据库的优化技术<大型网站优化技术> 对mysql优化时一个综合性的技术,主要包括 a: 表的设计合理化(符合3NF) b: 添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引] c: 分表技术(水平分割、垂直分割) d: 读写[写: update/delete/add]分离 e: 存储过程[模块化编程,可以提高速度] 数据库的三层结构: f: 对mysql配置优化[配置最大并发数my.ini, 调整缓存大小] g: mysql服务器硬件升级 h: 定时的去清除不需要的数据,定时进行碎片整理(MyISAM) CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [USING index_type] ON tbl_name (index_col_name,...) ◆什么样的表才是符合3NF (范式) 表的范式,是首先符合1NF, 才能满足2NF , 进一步满足3NF 1NF: 即表的列的具有原子性,不可再分解,即列的信息,不能分解, 只有数据库是关系型数据库(mysql/oracle/db2/informix/sysbase/sql server),就自动的满足1NF ?数据库的分类 关系型数据库: mysql/oracle/db2/informix/sysbase/sql server 非关系型数据库: (特点: 面向对象或者集合) NoSql数据库: MongoDB(特点是面向文档) 2NF: 表中的记录是唯一的, 就满足2NF, 通常我们设计一个主键来实现id primary key ; 3NF: 即表中不要有冗余数据, 就是说,表的信息,如果能够被推导出来,就不应该单独的设计一个字段来存放. 比如下面的设计就是不满足3NF:显示推导处理

mysql笔试题

面试笔试常考的mysql 数据库操作group by 分类:数据库2014-08-06 16:38 773人阅读评论(0) 收藏举报面试数据库mysql IT 面试中,数据库的相关问题基本上属于必考问题,而其中关于sql 语句也是经常考察的一个重要知识点。 下面介绍下sql语句中一个比较重要的操作group by,他的重要行一方面体现在他的理解困难度,一方面体现应用中的长见性。 首先,给出一个studnet学生表: [sql]view plaincopyprint? 1.CREATE TABLE `student` ( 2. `id` int(11) NOT NULL AUTO_INCREMENT, 3. `name` varchar(30) DEFAULT NULL, 4. `sex` tinyint(1) DEFAULT'0', 5. `score` int(10) NOT NULL, 6. `dept` varchar(10) DEFAULT NULL, 7.PRIMARY KEY (`id`) 8.) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8

添加一些测试数据: [sql]view plaincopyprint? 1.mysql> select * from student where id<10; 2.+----+------+------+-------+---------+ 3.| id | name | sex | score | dept | 4.+----+------+------+-------+---------+ 5.| 1 | a | 1 | 90 | dev | 6.| 2 | b | 1 | 90 | dev | 7.| 3 | b | 0 | 88 | design | 8.| 4 | c | 0 | 60 | sales | 9.| 5 | c | 0 | 89 | sales | 10.| 6 | d | 1 | 100 | product | 11.+----+------+------+-------+---------+ 给出需求,写出sql: 给出各个部门最高学生的分数。

SQL索引详解(优化数据库)

SQL索引一步到位 SQL索引在数据库优化中占有一个非常大的比例,一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱。 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间 下面举两个简单的例子: 图书馆的例子:一个图书馆那么多书,怎么管理呢?建立一个字母开头的目录,例如:a开头的书,在第一排,b开头的在第二排,这样在找什么书就好说了,这个就是一个聚集索引,可是很多人借书找某某作者的,不知道书名怎么办?图书管理员在写一个目录,某某作者的书分别在第几排,第几排,这就是一个非聚集索引 字典的例子:字典前面的目录,可以按照拼音和部首去查询,我们想查询一个字,只需要根据拼音或者部首去查询,就可以快速的定位到这个汉字了,这个就是索引的好处,拼音查询法就是聚集索引,部首查询就是一个非聚集索引. 看了上面的例子,下面的一句话大家就很容易理解了:聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续。就像字段,聚集索引是连续的,a后面肯定是b,非聚集索引就不连续了,就像图书馆的某个作者的书,有可能在第1个货架上和第10个货架上。还有一个小知识点就是:聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个。 1.2 索引的存储机制 首先,无索引的表,查询时,是按照顺序存续的方法扫描每个记录来查找符合条件的记录,这样效率十分低下,举个例子,如果我们将字典的汉字随即打乱,没有前面的按照拼 音或者部首查询,那么我们想找一个字,按照顺序的方式去一页页的找,这样效率有多底,大家可以想象。 聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致,其实理解起来非常简单,还是举字典的例子:如果按照拼音查询,那么都是从a-z的,是 具有连续性的,a后面就是b,b后面就是c,聚集索引就是这样的,他是和表的物理排列顺序是一样的,例如有id为聚集索引,那么1后面肯定是2,2后面肯定是3,所以说这样的搜索顺序的就是聚集索引。非聚集索引就和按照部首查询是一样是,可能按照偏房查询的时候,根据偏旁‘弓’字旁,索引出两个汉字,张和弘,但是这两个其实一个在100页,一个在1000页,(这里只是举个例子),他们的索引顺序和数据库表的排列顺序是不一样的,这个样的就是非聚集索引。 原理明白了,那他们是怎么存储的呢?在这里简单的说一下,聚集索引就是在数据库 被开辟一个物理空间存放他的排列的值,例如1-100,所以当插入数据时,他会重新排列 整个整个物理空间,而非聚集索引其实可以看作是一个含有聚集索引的表,他只仅包含原表中非聚集索引的列和指向实际物理表的指针。他只记录一个指针,其实就有点和堆栈差不多的感觉了

浅谈MySQL索引分析和优化

MySQL索引分析和优化列:

由于索引文件以B-树格式保存,MySQL能够立即转到合适的firstname,然后再转到合适的lastname,最后转到合适的age。在没有扫描数据文件任何一个记录的情况下,MySQL就正确地找出了搜索的目标记录! 那么,如果在firstname、lastname、age这三个列上分别创建单列索引,效果是否和创建一个firstname、lastname、age的多列索引一样呢?答案是否定的,两者完全不同。当我们执行查询的时候,MySQL只能使用一个索引。如果你有三个单列的索引,MySQL会试图选择一个限制最严格的索引。但是,即使是限制最严格的单列索引,它的限制能力也肯定远远低于firstname、lastname、age这三个列上的多列索引。

下面我们就来看看这个EXPLAIN分析结果的含义。 table:这是表的名字。 type:连接操作的类型。下面是MySQL文档关于ref连接类型的说明: “对于每一种与另一个表中记录的组合,MySQL将从当前的表读取所有带有匹配索引值的记录。如果连接操作只使用键的最左前缀,或者如果键不是UNIQUE或PRIMARY KEY类型(换句话说,如果连接操作不能根据键值选择出唯一行),则MySQL使用ref连接类型。如果连接操作所用的键只匹配少量的记录,则ref是一种好的连接类型。” 在本例中,由于索引不是UNIQUE类型,ref是我们能够得到的最好连接类型。 如果EXPLAIN显示连接类型是“ALL”,而且你并不想从表里面选择出大多数记录,那么MySQL的操作效率将非常低,因为它要扫描整个表。你可以加入更多的索引来解决这个问题。预知更多信息,请参见MySQL的手册说明。 possible_keys: 可能可以利用的索引的名字。这里的索引名字是创建索引时指定的索引昵称;如果索引没有昵称,则默认显示的是索引中第一个列的名字(在本例中,它是“firstname”)。默认索引名字的含义往往不是很明显。 Key:它显示了MySQL实际使用的索引的名字。如果它为空(或NULL),则MySQL不使用索引。 key_len:索引中被使用部分的长度,以字节计。在本例中,key_len是102,其中firstname 占50字节,lastname占50字节,age占2字节。如果MySQL只使用索引中的firstname部分,则key_len将是50。 ref:它显示的是列的名字(或单词“const”),MySQL将根据这些列来选择行。在本例中,MySQL根据三个常量选择行。 rows:MySQL所认为的它在找到正确的结果之前必须扫描的记录数。显然,这里最理想的数字就是1。 Extra:这里可能出现许多不同的选项,其中大多数将对查询产生负面影响。在本例中,MySQL 只是提醒我们它将用WHERE子句限制搜索结果集。 索引的缺点 到目前为止,我们讨论的都是索引的优点。事实上,索引也是有缺点的。 首先,索引要占用磁盘空间。通常情况下,这个问题不是很突出。但是,如果你创建每一种可能列组合的索引,索引文件体积的增长速度将远远超过数据文件。如果你有一个很大的表,索引文件的大小可能达到操作系统允许的最大文件限制。 第二,对于需要写入数据的操作,比如DELETE、UPDATE以及INSERT操作,索引会降低它们的速度。这是因为MySQL不仅要把改动数据写入数据文件,而且它还要把这些改动写入索引文件。 【结束语】在大型数据库中,索引是提高速度的一个关键因素。不管表的结构是多么简单,一次500000行的表扫描操作无论如何不会快。如果你的网站上也有这种大规模的表,那么你确实应该花些时间去分析可以采用哪些索引,并考虑是否可以改写查询以优化应用。要了解更多信息,请参见MySQL manual。另外注意,本文假定你所使用的MySQL是3.23版,部分查询不能在3.22版MySQL上执行。

相关文档
最新文档