MySQL如何创建索引?怎么优化?茶轴的青春

索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本。MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的。MySQL提供了Explain,用于显示SQL执行的详细信息,可以进行索引的优化。

1.硬件问题。如网络速度慢,内存不足,I/O吞吐量小,磁盘空间满了等。

2.没有索引或者索引失效。(一般在互联网公司,DBA会在半夜把表锁了,重新建立一遍索引,因为当你删除某个数据的时候,索引的树结构就不完整了。所以互联网公司的数据做的是假删除.一是为了做数据分析,二是为了不破坏索引)

3.数据过多(分库分表)

4.服务器调优及各个参数设置(调整my.cnf)

1.先观察,开启慢查询日志,设置相应的阈值(比如超过3秒就是慢SQL),在生产环境跑上个一天过后,看看哪些SQL比较慢。

2.Explain和慢SQL分析。比如SQL语句写的烂,索引没有或失效,关联查询太多(有时候是设计缺陷或者不得以的需求)等等。

3.ShowProfile是比Explain更近一步的执行细节,可以查询到执行每一个SQL都干了什么事,这些事分别花了多少秒。

4.找DBA或者运维对MySQL进行服务器的参数调优。

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。我们可以简单理解为:快速查找排好序的一种数据结构。Mysql索引主要有两种结构:B+Tree索引和Hash索引。我们平常所说的索引,如果没有特别指明,一般都是指B树结构组织的索引(B+Tree索引)。索引如图所示:

最外层浅蓝色磁盘块1里有数据17、35(深蓝色)和指针P1、P2、P3(黄色)。P1指针表示小于17的磁盘块,P2是在17-35之间,P3指向大于35的磁盘块。真实数据存在于子叶节点也就是最底下的一层3、5、9、10、13……非叶子节点不存储真实的数据,只存储指引搜索方向的数据项,如17、35。

查找过程:例如搜索28数据项,首先加载磁盘块1到内存中,发生一次I/O,用二分查找确定在P2指针。接着发现28在26和30之间,通过P2指针的地址加载磁盘块3到内存,发生第二次I/O。用同样的方式找到磁盘块8,发生第三次I/O。

前文铺垫完成,进入实操部分,先来插入测试需要的数据:

CREATETABLE`user_info`(

`id`BIGINT(20)NOTNULLAUTO_INCREMENT,

`name`VARCHAR(50)NOTNULLDEFAULT'',

`age`INT(11)DEFAULTNULL,

PRIMARYKEY(`id`),

KEY`name_index`(`name`)

)ENGINE=InnoDBDEFAULTCHARSET=utf8;

INSERTINTOuser_info(name,age)VALUES('xys',20);

INSERTINTOuser_info(name,age)VALUES('a',21);

INSERTINTOuser_info(name,age)VALUES('b',23);

INSERTINTOuser_info(name,age)VALUES('c',50);

INSERTINTOuser_info(name,age)VALUES('d',15);

INSERTINTOuser_info(name,age)VALUES('e',20);

INSERTINTOuser_info(name,age)VALUES('f',21);

INSERTINTOuser_info(name,age)VALUES('g',23);

INSERTINTOuser_info(name,age)VALUES('h',50);

INSERTINTOuser_info(name,age)VALUES('i',15);

CREATETABLE`order_info`(

`user_id`BIGINT(20)DEFAULTNULL,

`product_name`VARCHAR(50)NOTNULLDEFAULT'',

`productor`VARCHAR(30)DEFAULTNULL,

KEY`user_product_detail_index`(`user_id`,`product_name`,`productor`)

INSERTINTOorder_info(user_id,product_name,productor)VALUES(1,'p1','WHH');

INSERTINTOorder_info(user_id,product_name,productor)VALUES(1,'p2','WL');

INSERTINTOorder_info(user_id,product_name,productor)VALUES(1,'p1','DX');

INSERTINTOorder_info(user_id,product_name,productor)VALUES(2,'p1','WHH');

INSERTINTOorder_info(user_id,product_name,productor)VALUES(2,'p5','WL');

INSERTINTOorder_info(user_id,product_name,productor)VALUES(3,'p3','MA');

INSERTINTOorder_info(user_id,product_name,productor)VALUES(4,'p1','WHH');

INSERTINTOorder_info(user_id,product_name,productor)VALUES(6,'p1','WHH');

INSERTINTOorder_info(user_id,product_name,productor)VALUES(9,'p8','TE');

初体验,执行Explain的效果:

索引使用情况在possible_keys、key和key_len三列,接下来我们先从左到右依次讲解。

--id相同,执行顺序由上而下

explainselectu.*,o.*fromuser_infou,order_infoowhereu.id=o.user_id;

--id不同,值越大越先被执行

explainselect*fromuser_infowhereid=(selectuser_idfromorder_infowhereproduct_name='p8');

可以看id的执行实例,总共有以下几种类型:

table表示查询涉及的表或衍生的表:

explainselecttt.*from(selectu.*fromuser_infou,order_infoowhereu.id=o.user_idandu.id=1)tt

id为1的的表示id为2的u和o表衍生出来的。

type字段比较重要,它提供了判断查询是否高效的重要依据依据。通过type字段,我们判断此次查询是全表扫描还是索引扫描等。

通常来说,不同的type类型的性能关系如下:

ALL

ALL类型因为是全表扫描,因此在相同的查询条件下,它是速度最慢的。而index类型的查询虽然不是全表扫描,但是它扫描了所有的索引,因此比ALL类型的稍快.后面的几种类型都是利用了索引来查询数据,因此可以过滤部分或大部分数据,因此查询效率就比较高了。

它表示mysql在查询时,可能使用到的索引。注意,即使有些索引在possible_keys中出现,但是并不表示此索引会真正地被mysql使用到。mysql在查询时具体使用了哪些索引,由key字段决定。

此字段是mysql在当前查询时所真正使用到的索引。比如请客吃饭,possible_keys是应到多少人,key是实到多少人。当我们没有建立索引时:

explainselecto.*fromorder_infoowhereo.product_name='p1'ando.productor='whh';

createindexidx_name_productoronorder_info(productor);

dropindexidx_name_productoronorder_info;

建立复合索引后再查询:

表示查询优化器使用了索引的字节数,这个字段可以评估组合索引是否完全被使用。

这个表示显示索引的哪一列被使用了,如果可能的话,是一个常量。前文的type属性里也有ref,注意区别。

rows也是一个重要的字段,mysql查询优化器根据统计信息,估算sql要查找到结果集需要扫描读取的数据行数,这个值非常直观的显示sql效率好坏,原则上rows越少越好。可以对比key中的例子,一个没建立索引钱,rows是9,建立索引后,rows是4。

explain中的很多额外的信息会在extra字段显示,常见的有以下几种内容:

explainselectu.*,o.*fromuser_infouLEFTJOINorder_infooonu.id=o.user_id;

执行结果,type有ALL,并且没有索引:

开始优化,在关联列上创建索引,明显看到type列的ALL变成ref,并且用到了索引,rows也从扫描9行变成了1行:

这里面一般有个规律是:左链接索引加在右表上面,右链接索引加在左表上面。

索引虽然能非常高效的提高查询速度,同时却会降低更新表的速度。实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的。

THE END
1.评论数据库设计mysqlmob64ca12f463e6的技术博客在当今的数字化世界,评论功能是许多应用和网站不可或缺的一部分。为了有效地存储和管理这些评论,我们需要设计一个数据库。在本篇文章中,我将引导你一步步实现一个简单的评论数据库设计,使用MySQL作为我们的数据库管理系统。 流程概览 在设计评论数据库之前,我们需要明确每一步的流程。下面是设计步骤的一览表: https://blog.51cto.com/u_16213448/12864418
2.mysql创建图书馆的数据库mysql随着数字化时代的到来,图书馆作为知识和文化的传播中心,其信息化、数字化建设已成为必然趋势。MySQL作为一款开源、高性能的数据库管理系统,广泛应用于图书馆数据库建设中。本文将详细介绍如何使用MySQL创建图书馆数据库,包括基础设置、数据表设计、数据插入以及应用实战等方面。 https://blog.yyzq.team/post/526578.html
3.数据库课程设计mysql图书馆管理系统这些SQL语句只是一个示例,实际操作时需要根据具体需求进行调整。 在实现功能时,应确保遵循数据库设计文档和用户手册。 这个示例仅用于演示如何使用SQL语句实现图书馆管理系统的基本功能。在实际项目中,可能需要考虑更多的细节,如数据校验、错误处理、用户权限控制等。https://blog.csdn.net/u011355389/article/details/141780460
4.图书馆管理系统书籍数据表MySQL数据库设计大全数据库设计大全,MySQL数据库表结构图书馆管理系统-书籍数据表,果创云,果创云(YesApi.cn),让项目开发更简单!果创云是免费,免开发,直接可用的开放式平台,拥有小白云端接口、小白数据管家等多个产品。我们将致力为开发者提供贴心的技术服务,为企业提供一站式技术解决https://open.yesapi.cn/tablelist/yesapi_b_book.html
5.mysql数据库建表mysql数据库建表user,book,record的代码通过以上代码示例,我们可以看到在MySQL中建表的基本语法和常用数据类型。建表不仅仅是定义数据表的结构,还可以通过添加约束条件和外键关联等操作,提高数据的完整性和安全性。合理设计和规范建表可以提高数据库的性能和可维护性,对于数据的存储和管理具有重要意义。无论是用户表、图书表还是借阅记录表,都是数据库中常见https://www.nzw6.com/30633.html
6.武汉大学图书馆数据库(精选6篇)根据信息时代下信息需求的变化,各大学图书馆都加强了对数字文献资源的建设,大学特色数据库建设便是其中重要内容。为满足高校教学科研在数字化资源方面的需求,早在上世纪九十年代后期,我国高校图书馆就开始从自身特色馆藏资源建设入手,对各类特色数据库进行建设。新时期调查显示,我国80%的高校都建设了特色图书馆数据库,https://www.360wenmi.com/f/fileo02wd4ba.html
7.mysql数据库图书馆案例腾讯云开发者社区mysql数据库图书馆案例 基础概念 MySQL是一种关系型数据库管理系统(RDBMS),它使用结构化查询语言(SQL)进行数据管理。在图书馆案例中,MySQL可以用来存储图书信息、借阅记录、读者信息等。 相关优势 开放性:MySQL是开源软件,用户可以自由下载和使用。 高性能:MySQL提供了出色的性能,能够处理大量数据和高并发访问。 易用https://cloud.tencent.com/developer/information/mysql%E6%95%B0%E6%8D%AE%E5%BA%93%E5%9B%BE%E4%B9%A6%E9%A6%86%E6%A1%88%E4%BE%8B-ask
8.blog/201801/20180121阿里云数据库团队、PG社区、云栖社区、云栖技术日、阿里云技术创新中心共同推出《PG天天象上》活动,涵盖《PostgreSQL 应用案例、原理、最佳实践》、《PPAS + ADAM Oracle 迁移上云》、《企业数据库安全、自主可控》、《各行业的TOP软件开发商分享》、《数据库服务提供商、集成商的分享》、《企业圆桌深入研讨》等系列https://github.com/digoal/blog/blob/88773aa8ac91535574feb43392058dce5070f933/201801/20180121_01.md
9.Java毕业设计:基于JSP+MySQL的图书馆借阅系统设计与实现简介:本文将介绍如何使用Java语言、JSP技术以及MySQL数据库,设计和实现一个图书馆借阅系统。该系统将为用户提供图书查询、借阅、归还以及信息管理等功能。通过这个项目,你将掌握Java Web开发的基本技能,包括数据库设计和操作、JSP页面开发以及Java后端逻辑处理等。 https://developer.baidu.com/article/details/2766562
10.计算机开题报告(集锦15篇)软件上:我校初步建成了具有求精特色的 教育信息资源库,包括《k12学科资源库》、《数字图书馆》(近两万册电子书籍)、《信息技术与课程整合》电子期刊等大型教育数据库、试题库、资料库,涵盖国情教育、心理咨询、青春期教育、健康教育、艺术教育、升学指南、教育法规等教育信息库,能充分满足现代教育管理和一线教学的需要https://www.ruiwen.com/kaitibaogao/6281612.html
11.数据设计管理系统论文8篇(全文)基于遥测数据管理系统的数据需求,必须有一个数据系统中心,以数据服务系统的形式保存和处理相关用户需求,对外的数据用户主要包括综合测试系统数据比对用户、办公室数据分析用户、技术实验室数据验证用户以及其它现场数据用户,因此,基于虚拟平台的卫星数据管理与应用系统总体结构。 https://www.99xueshu.com/w/fileyvjrsvd4.html
12.图书管理系统MySql数据库C#开发的简单但功能比较全面的使用mysql数据库的图书管理系统https://www.iteye.com/resource/lg349496094-10369459
13.上海建桥学院图书馆TP311.138AC/128 Access数据库基础教程实验指导与习题集 主编饶拱维, 杨贵茂, 吴华光 中国水利水电出版社 2019 TP311.138AC/149 Access数据库技术及应用 主编张志辉, 余志兵, 廖建平 中国铁道出版社有限公司 2021 TP311.138SQ/176 深入理解MySQL主从原理 高鹏著 电子工业出版社 2021 TP311.5/347:3 软件体系结构原理https://library.gench.edu.cn/Sub.html#!Function/Article/Type/Detail/Column/f98e7605-098a-4c64-ab19-27543dbb7a3e/Item/59718b3e-e6b1-4e06-99a2-2d92ea1aa441
14.图书馆数据库管理系统用例图在图书馆数据库管理系统中,例如“查询图书信息”、“借阅图书”、“归还图书”等用例。 1.2 参与者 参与者是使用系统的人、机器、其他系统或其他实体,它们与用例之间通过交互实现。 在图书馆数据库管理系统中,例如“读者”、“图书管理员”等参与者。 1.3 关系 关系就是参与者和用例之间的联系。可以用连线来表示。https://www.volcengine.com/theme/845520-T-7-1
15.基于PHPMySQL图书馆管理系统设计与实现3系统的设计与实现 2.2 功能需求 3.1 系统数据库设计 通过对一些高校图书馆的考察、分析,并结合我 图书馆管理系统中,采用的是MySQL 数据库。 58 严遮铅小吐舰了沉啥乒矣倾漆炸锦捆育杜氧艳萝云庞感亢铰宫奔远宾垫曙旨此会逆厉械瘸叮蒙帅钮嘘阵泌吟匿吱粮黎光钨志硷抒并菱壁货美钠隔游扩乖亡蠕羹https://m.book118.com/html/2017/0704/120252775.shtm
16.网络中心包括课堂与实训室数字化教学资源(媒体素材、试题、试卷、课件、案例、文献资料、网络课程、教学工具软件APP、常见问题解答和资源目录索引等)、仿真实训资源(仿真实验软件、仿真实训软件和仿真实习软件等)、数字场馆资源(职业体验馆、数字博物馆、数字艺术馆、数字科技馆、图书馆资源等),也规定了数字资源管理与共享的要求http://www.xtzy.com/wlzx/detail.jsp?public_id=153330
17.图书管理系统:使用jsplayuimysql完成的Web端图书管理系统图书馆表 编号、图书馆名、描述 规则表 编号、限制借阅数量、限制借阅天数、图书超期每天费用 公告表 编号、标题、公告内容、发布日期 二、部署 下载压缩包,或者使用git clone下载(使用git checkout maven可以更换为分支maven,其使用maven进行依赖管理,更便于运行部署) 将library.sql文件导入mysql数据库(不会请百https://toscode.mulanos.cn/mingyuefusu/tushuguanlixitong