Skip to content

09 普通索引与唯一索引的选择

差别

前提:MySQL InnoDB引擎。在InnoDB中,每个数据页的大小默认是16KB。

查询过程:

  • 普通索引:查询满足条件的第一个记录,之后查找接下来的记录,直到查找不到对应的满足条件的记录;
  • 唯一索引:查询满足条件的第一条记录,返回,(唯一索引唯一性)。

不过对于这种查询,性能差距是微乎其微的。

更新过程:

在更新操作的时候,存在数据页的概念,存在数据页未命中内存,需要从磁盘写入到内存中操作。

两种情况:更新数据页在内存中和不在内存中。

需要更新的记录的数据页在内存中

  • 唯一索引:查找对应的条件,找到对应的位置,判断有没有冲突,插入更新值,结束;
  • 普通索引:查找对应的条件,找到对应的位置,插入更新值,结束。

需要更新的记录的数据页不在内存中

  • 唯一索引:将需要变更新的数据页写入内存,判断有无冲突,插入更新值,结束;
  • 普通索引:将更新记录记录在 change buffer 中,结束。

当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InooDB会将这些更新操作缓存在change buffer中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行change buffer中与这个页有关的操作。通过这种方式就能保证这个数据逻辑的正确性。

Change buffer

将数据从磁盘读入内存涉及随机IO的访问,是数据库里面成本最高的操作之一。

在业务中,写多读少的场景使用普通索引的性能优势是非常明显的。但是写完立即读取的话,作用就是相反的。

结论:考虑更新场景比较多的情况下,使用普通索引比较好。

Redo 节省的是随机写对磁盘的 IO 操作;

Change Buffer 节省的是随机读对磁盘的 IO 操作。


Q:change buffer一开始是写内存的,那么如果这个时候机器掉电重启,会不会导致change buffer丢失呢?change buffer丢失可不是小事儿,再从磁盘读入数据可就没有了merge过程,就等于是数据丢失了。会不会出现这种情况呢?

A:数据不会丢失

`

wp-core

version: 5.6 site_language: zh_CN user_language: zh_CN timezone: Asia/Shanghai permalink: /%post_id%.html https_status: true multisite: false user_registration: 0 blog_public: 1 default_comment_status: open environment_type: production user_count: 1 dotorg_communication: true

wp-paths-sizes

wordpress_path: /var/www/html/www.debuginn.cn wordpress_size: 57.72 MB (60528779 bytes) uploads_path: /var/www/html/www.debuginn.cn/wp-content/uploads uploads_size: 828.32 MB (868556471 bytes) themes_path: /var/www/html/www.debuginn.cn/wp-content/themes themes_size: 4.34 MB (4552415 bytes) plugins_path: /var/www/html/www.debuginn.cn/wp-content/plugins plugins_size: 22.99 MB (24107580 bytes) database_size: 61.78 MB (64782336 bytes) total_size: 975.16 MB (1022527581 bytes)

wp-active-theme

name: MDx (mdx) version: 2.0.0 author: AxtonYao author_website: https://flyhigher.top parent_theme: none theme_features: core-block-patterns, post-thumbnails, post-formats, menus, widgets theme_path: /var/www/html/www.debuginn.cn/wp-content/themes/mdx auto_update: 禁用

wp-plugins-active (17)

Advanced Editor Tools (previously TinyMCE Advanced): version: 5.6.0, author: Automattic, 自动更新已启用 Akismet Anti-Spam: version: 4.1.8, author: Automattic, 自动更新已启用 Aliyun OSS: version: 3.2.7, author: Ivan Chou, 自动更新已启用 All In One WP Security: version: 4.4.6, author: Tips and Tricks HQ, Peter Petreski, Ruhul, Ivy, 自动更新已启用 Broken Link Checker: version: 1.11.15, author: WPMU DEV, 自动更新已启用 Code Syntax Block: version: 2.0.2, author: Marcus Kazmierczak, 自动更新已启用 Comment Email Reply: author: (undefined), version: 1.0.5, 自动更新已启用 Easy WP SMTP: version: 1.4.5, author: wpecommerce, alexanderfoxc, 自动更新已启用 Google XML Sitemaps: version: 4.1.1, author: Auctollo, 自动更新已启用 Insert Estimated Reading Time: version: 1.2, author: nigauri, 自动更新已启用 Kill 429: version: 1.1.0, author: wbolt, 自动更新已启用 PDF Embedder: version: 4.6.1, author: Lever Technology LLC, 自动更新已启用 PWA: version: 0.6.0, author: PWA Plugin Contributors, 自动更新已启用 Robots.txt Editor: version: 1.1.4, author: Processby, 自动更新已启用 Spider Analyser: version: 1.2.1, author: wbolt team, 自动更新已启用 WordPress Importer: version: 0.7, author: wordpressdotorg, 自动更新已启用 WP Alu2Button: version: 1.0.5, author: hades, 自动更新已启用

wp-media

image_editor: WP_Image_Editor_GD imagick_module_version: 不可用 imagemagick_version: 不可用 file_uploads: File uploads is turned off post_max_size: 8M upload_max_filesize: 2M max_effective_size: 2 MB max_file_uploads: 20 gd_version: 2.3.0 ghostscript_version: 9.26

wp-server

server_architecture: Linux 4.4.0-151-generic x86_64 httpd_software: nginx/1.10.3 php_version: 7.4.14 64bit php_sapi: fpm-fcgi max_input_variables: 1000 time_limit: 30 memory_limit: 128M admin_memory_limit: 256M max_input_time: 60 upload_max_filesize: 2M php_post_max_size: 8M curl_version: 7.47.0 OpenSSL/1.0.2g suhosin: false imagick_availability: false pretty_permalinks: true htaccess_extra_rules: true

wp-database

extension: mysqli server_version: 5.7.31-0ubuntu0.16.04.1 client_version: mysqlnd 7.4.14

wp-constants

WP_HOME: undefined WP_SITEURL: undefined WP_CONTENT_DIR: /var/www/html/www.debuginn.cn/wp-content WP_PLUGIN_DIR: /var/www/html/www.debuginn.cn/wp-content/plugins WP_MAX_MEMORY_LIMIT: 256M WP_DEBUG: false WP_DEBUG_DISPLAY: true WP_DEBUG_LOG: false SCRIPT_DEBUG: false WP_CACHE: false CONCATENATE_SCRIPTS: undefined COMPRESS_SCRIPTS: undefined COMPRESS_CSS: undefined WP_LOCAL_DEV: undefined DB_CHARSET: utf8mb4 DB_COLLATE: undefined

wp-filesystem

wordpress: writable wp-content: writable uploads: writable plugins: writable themes: writable

`