MySQL改善性能最好的方式,就是通过数据库中合理地使用索引,换句话说,索引是提高 MySQL 数据库查询性能的主要手段。在下面的章节中,介绍了索引类型、强制索引、全文索引。

MySQL 索引可以分为单列索引、复合索引、唯一索引、主键索引等。这里,将为读者介绍这几种索引的特点。

单列索引:单列索引是最基本的索引,它没有任何限制。

创建一个单列索引,例如:

create index index_name on tbl_name(index_col_name);同时,也可以通过修改表结构的方式添加索引,例如:

alter table tbl_name add index index_name on (index_col_name);复合索引复合索引:复合索引是在多个字段上创建的索引。复合索引遵守“最左前缀”原则,即在查询条件中使用了复合索引的第一个字段,索引才会被使用。因此,在复合索引中索引列的顺序至关重要。

创建一个复合索引,例如:

create index index_name on tbl_name(index_col_name,...);同时,也可以通过修改表结构的方式添加索引,例如:

创建一个复合索引,例如:

create unique index index_name on tbl_name(index_col_name,...);同时,也可以通过修改表结构的方式添加索引,例如:

alter table tbl_name add unique index index_name on (index_col_name,...);主键索引主键索引:主键索引是一种特殊的唯一索引,不允许有空值。此外, CREATE INDEX 不能创建主键索引,需要使用 ALTER TABLE 代替,例如:

alter table tbl_name add primary key(index_col_name);强制索引有时,因为使用 MySQL 的优化器机制,原本应该使用索引的优化器,反而选择执行全表扫描或者执行的不是预期的索引。此时,可以通过强制索引的方式引导优化器采取正确的执行计划。

使用强制索引,SQL 语句只使用建立在 index_col_name 上的索引,而不使用其它的索引。

select * from tbl_name force index (index_col_name) …切记,不要滥用强制索引,因为 MySQL 的优化器会同时评估 I/O 和 CPU 的成本,一般情况下,可以自动分析选择最合适的索引。

如果优化器成本评估错误,因而没有选择最佳方案,最好的方法应该是将合适的索引修改得更好。

如果某个 SQL 语句使用强制索引,需要在系统迭代开发过程中时时维护强制索引,一方面,需要保证使用的强制索引最优,另外一面,需要保证所使用的强制索引不能被误删,不然将导致 SQL 报错。

因此,如果某个 SQL 语句必须要使用强制索引,建议在团队内部开展严格地评审后才可以使用。

在一般情况下,模糊查询都是通过 like 的方式进行查询。但是,对于海量数据,这并不是一个好办法,在 like "value%" 可以使用索引,但是对于 like "%value%" 这样的方式,执行全表查询,这在数据量小的表,不存在性能问题,但是对于海量数据,全表扫描是非常可怕的事情,所以 like 进行模糊匹配性能很差。

这种情况下,需要考虑使用全文搜索的方式进行优化。全文搜索在 MySQL 中是一个 FULLTEXT 类型索引。 FULLTEXT 索引在 MySQL 5.6 版本之后支持 InnoDB,而之前的版本只支持 MyISAM 表。

假设,有一张应用全文索引表。

CREATE TABLE IF NOT EXISTS `app_full_text` (  `app_id` bigint(20) NOT NULL,  `app_name_full_text` text NOT NULL,  `introduce_full_text` text NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;现在需要对应用的名称创建全文索引,可以这么设计。

alter table `app_full_text` add fulltext key `app_name_intro` (`app_name_full_text`);默认 MySQL 不支持中文全文检索,对此,网上的方案很多,例如添加 MySQL 扩展,或者将内容转换成拼音的方式存储在索引表,或者使用 IKAnalyzer 分词库等,其效果都不是非常的理想。使用拼音分词,虽然可以查询到内容,但是如果拼音相同的情况,是非常致命的,而且分词的粒度也是个很可怕的问题。使用 IKAnalyzer 分词库,效果也不是很好。因为业务的需要,命中率也是非常重要的,有的关键字没有进行分词导致查询不到的问题。

我之前的临时解决方案。如下:

为中文内容表提供一个全文索引表,存储全文索引分词信息,两张表根据中文内容表的 ID 进行关联。

将内容进行分词后,用 base64 编码,保存在全文索引表中。

关键的一步,如何分词,分词的命中率问题。很简单,自定义分词库,写一个分词算法将所有的组合进行分词,在内容不多的情况下非常有用。举个例子,“梁桂钊”,可以进行自定义分词:[梁、桂、钊、梁桂、桂钊、梁桂钊]。

事实上,MySQL 全文搜索只是一个临时方案,对于全文搜索场景,更专业的做法是使用全文搜索引擎,例如 ElasticSearch 或 Solr。

现在小朋友的作业都很难,看看聪明的你是否可以解答并且说出原因,零度算收集了,以后你们家的小朋友需要的时候可以找我拿这些,哈哈!!!本次题目为:

mysql索引怎么设计,MySQL如何设计索引相关推荐

  1. php 如何设计索引_Mysql学习浅谈mysql的索引设计原则以及常见索引的区别

    <Mysql学习浅谈mysql的索引设计原则以及常见索引的区别>要点: 本文介绍了Mysql学习浅谈mysql的索引设计原则以及常见索引的区别,希望对您有用.如果有疑问,可以联系我们. 索 ...

  2. Mysql使用大全(MySQL架构与存储引擎 、事务 、业务设计 、索引 、数据结构 、执行计划 、数值类型)

    这是一篇mysql大全,学习完这篇文章,相信在日常业务和面试完全不在问题,下面我们来一一介绍 MySQL架构与存储引擎 全局变量和会话变量 要想显式指定是否设置全局或会话变量,使用GLOBAL或SES ...

  3. MySQL性能调优与设计——MySQL中的索引

    MySQL中的索引 InnoDB存储引擎支持以下几种常见索引:B+树索引.全文索引.哈希索引,其中比较关键的是B+树索引. B+树索引 InnoDB中的索引自然也是按照B+树来组织的,B+树的叶子节点 ...

  4. ef mysql 优化_MySQL性能管理及架构设计(二):数据库结构优化、高可用架构设计、数据库索引优化...

    一.数据库结构优化(非常重要) 1.1 数据库结构优化目的 1.减少数据冗余:(数据冗余是指在数据库中存在相同的数据,或者某些数据可以由其他数据计算得到),注意,尽量减少不代表完全避免数据冗余: 2. ...

  5. MySQL入门-day06-数据库表设计、视图、索引

    文章目录 数据库表设计 三大范式 第一范式 第二范式 第三范式 ER图与数据建模 什么是ER图 ER图核心要素 ER图实践 数据建模 外键约束与级联操作 外键 什么是外键? 什么是外键约束 外键对表的 ...

  6. mysql索引空间太大_MySQL优化索引

    1.  MySQL如何使用索引 索引用于快速查找具有特定列值的行.如果没有索引,MySQL必须从第一行开始,然后遍历整个表以找到相关的行.表越大,花费越多.如果表中有相关列的索引,MySQL可以快速确 ...

  7. 为什么MySQL数据库要用B+树存储索引?

    小史是一个应届生,虽然学的是电子专业,但是自己业余时间看了很多互联网与编程方面的书,一心想进BAT互联网公司. 话说两个多月前,小史通过了A厂的一面,两个多月后的今天,小史终于等到了A厂的二面. 简单 ...

  8. 万亿级企业MySQL海量存储分库分表设计实践

    互联网业务往往使用MySQL数据库作为后台存储,存储引擎使用InnoDB.我们针对互联网自身业务特点及MySQL数据库特性,讲述在具体业务场景中如何设计表和分表.本文从介绍MySQL相关基础架构设计入 ...

  9. mysql索引详细介绍简书_MySql索引详解

    image 常见索引类型(实现层面) 索引种类(应用层面) 聚簇索引与非聚簇索引 覆盖索引 最佳索引使用策略 1.常见索引类型(实现层面) 首先不谈Mysql怎么实现索引的,先马后炮一下,如果让我们来 ...

最新文章

  1. 卷积神经网络基础:(6)卷积神经网络原理
  2. 计算机网络基础 — 网络设备 — 网桥(Bridge)
  3. pinctrl 和 gpio 子系统
  4. 职业相关职位及职位能力要求知识点大纲范围
  5. MySQL设计索引的原则
  6. python 蓝牙模块pybluz安装
  7. mysql 学习笔记 多表查询02
  8. prefix.pch文件的一些简单使用
  9. java用XSSFWorkbook实现读写Excel
  10. php图片提交,php+js实现图片的上传、裁剪、预览、提交示例
  11. HDOJ 1021-1025
  12. 【matplotlib笔记】plt.subplot()绘制子图
  13. arduino动态刷新显示_2019 台北电脑展:华硕显示器产品精锐尽出
  14. 每日英语:6 Brainy Habits of the Wisest People
  15. 【跨年烟花代码】用C语言来写“烟花”,快拿去给心中的那个人看
  16. 主动轮廓线模型Snake模型简介amp;openCV中cvSnakeImage()函数代码分析
  17. Fractal Streets
  18. 2021-2022学年广州市南武中学七年级第一学期期中考试英语试题
  19. UnionPay,ChinaPay 最新 银联支付接口C#\Asp.net\MVC 版本
  20. 亚马逊必备神器:防关联浏览器

热门文章

  1. Spring Security OAuth2.0认证授权五:用户信息扩展到jwt
  2. c3p0 SQLException: An attempt by a client to checkout a Connection has timed out异常
  3. LibZXing二维码工具
  4. 相机计算坐标公式_相机采样点的坐标转换方法与流程
  5. 江苏计算机报名时间2021年上半年,关于2021年春季江苏省计算机等级考试报名的通知...
  6. 网络工程师的敲门砖,2022最新HCIA-Datacom题库H12-811首发分享
  7. 360和360极速浏览器无法打开vue项目的问题
  8. iOS生态链寄生数百万开发者:艰难求生面临决择
  9. 水生生物学类毕业论文文献包含哪些?
  10. unity3D 摄像机旋转、平移、缩放