改善性能最好的方式,就是通过数据库中合理地使用索引,换句话说,索引是提高 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 unique index index_name on tbl_name(index_col_name,...);

同时,也可以通过修改表结构的方式添加索引,例如:alter table tbl_name add index index_name on (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(03) 如何设计索引...相关推荐

  1. Node.js 连接 MySQL 并进行数据库操作 –node.js 开发指南

    Node.js是一套用来编写高性能网络服务器的JavaScript工具包 通常在NodeJS开发中我们经常涉及到操作数据库,尤其是 MySQL ,作为应用最为广泛的开源数据库则成为我们的首选,本篇就来 ...

  2. mysql crm动态列设计_值得收藏:一份非常完整、详细的MySQL规范

    一.数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名 ...

  3. 图上上传页面设计_无线端页面设计“三大雷区”

    无线视觉规范 手机端页面的设计有许多的规范,大到涉及整个页面的排版呈现方式,小到一个icon的尺寸大小,这都关系到视觉页面的美观程度以及用户体验设计.所以应该积极主动去分析深入了解并研究出可行的解决方 ...

  4. 其他系统 对外接口设计_领导:项目有个接口要对外开放,小张你来设计一下?...

    前言 最近有个项目需要对外提供一个接口,提供公网域名进行访问,而且接口和交易订单有关,所以安全性很重要:这里整理了一下常用的一些安全措施以及具体如何去实现. 安全措施 个人觉得安全措施大体来看主要在两 ...

  5. mysql跳过安全_几年了,作为一个码农终于把MySQL日记看懂了!

    一.写作背景 大家都清楚,日志是 MySQL数据库的重要组成部分,记录着数据库运行期间各种状态信息.MySQL日志主要包括错误日志.查询日志.慢查询日志.二进制日志(binlog)和事务日志(redo ...

  6. python 数据科学书籍_您必须在2020年阅读的数据科学书籍

    python 数据科学书籍 "We're entering a new world in which data may be more important than software.&qu ...

  7. vs mysql 环境安装教程_使用 VS 开发连接 MySQL 的 Web 项目的环境配置

    前言: 安装 开发环境 软件安装: 版本选择:MySQL for Visual Studio 最新版 Connector/NET 版本必须与 MySql.Data 和 MySql.Data.Entit ...

  8. 企业微信加密消息体_无代码开发能保障企业系统数据的安全吗?这篇文章为你全面解析!...

    轻流<无代码开发白皮书>是从五年来的行业探索经验出发,对比研究了管理软件不同开发方式的优劣,总结了管理软件未来的发展趋势,并率先对无代码开发理念进行系统性阐述:详细解读了无代码开发广阔的应 ...

  9. 千里眼摄像头支持对象存储吗_“无处安放”的海量数据,万能的对象存储

    原标题:"无处安放"的海量数据,万能的对象存储 作为经常坐地铁通勤的上班族,你在地铁上一般怎样打发时间呢? 据了解,地铁上80%的乘客都会通过手机来消磨时间,其中又有大部分是在看视 ...

最新文章

  1. Docker Desktop添加对Kubernetes的支持
  2. 将 Silverlight 与网页集成【转载】
  3. mysql 去除括号_MySQL语句批量去除括号及内容
  4. 3des java ecb_PHP 3DES加密 与JAVA通用 加密模式:ECB
  5. HTML5 + CSS 左右排版自适应高
  6. ccf 智能运维 裴丹_智能运维 聊一聊实时计算系统
  7. linux内容对齐的快捷键,linux第一波命令总结
  8. 【jmx】java jmx 获取 kafka topic的logStart LogEnd信息
  9. Netty实现长连接简单例子
  10. 1000道Python题库系列分享七(30道)
  11. Python跨目录引用模块(文件)
  12. linux中ifi_info的英文全称,【DNS服务器IP地址-域名注册查询-CDN加速技术】
  13. 3G dual band 使用策略
  14. SEVERE: Could not contact [localhost:8005] (base port [8005] and offset [0]). Tomcat may not be runn
  15. 安徽阜阳计算机高中学校排名,安徽省高中学校实力排名
  16. Java用户账号密码创建登录
  17. Oscar-实验过程记录
  18. 腾讯云服务器支持,腾讯云服务器能拿来干嘛(可以做的事情很多)
  19. 一文了解 AI 商品模型训练平台
  20. Android仿知乎图片墙

热门文章

  1. 热带雨林绘画软件测试,手绘教程!手把手教你绘制光影超棒的热带雨林插画
  2. 浅谈项目经理的工作职责
  3. 如何做成功的项目经理
  4. E. Pencils and Boxes(尺取dp)
  5. Spark 中 JVM 内存使用及配置详情、spark报错与调优、Spark内存溢出OOM异常
  6. rocketmq中broker的端口
  7. 干货,分享!AdminEx - 响应式设计后台管理模版!!!
  8. 银行工作可获得的薪酬及待遇
  9. 南大通用GBase8s 常用SQL语句(120) DISCONNECT 语句
  10. android异常相机处理,android 调用系统相机拍照的各种异常处理