【修真院java小课堂】什么是DB的索引?

大家好,我是IT修真院郑州分院第8期学员,一枚正直善良的java程序员。今天给大家分享一下,修真院官网 java任务中可能会使用到的知识点:


什么是DB的索引,多大的数据量下建索引会有性能的差别,什么样的情况下该对字段建索引??


【修真院java小课堂】什么是DB的索引?

1.背景介绍

什么是DB的索引?
索引是对数据库表中一个或多个列的值进行排序的结构。

SELECT * FROM student_info WHERE name='Jesus'

没有索引的情况下,搜索每一行数据,确认姓名是否是Jesus,全表扫描,耗时久


2.知识剖析

2.1索引的原理
简单理解:字典中有偏旁部首查找,拼音查找,笔画查找(分别都是索引)。按照一定的规则将部分特征排布好,并和数据所在的标识连接起来。

索引是一种数据结构,常见的有平衡树、哈希桶。

2.2索引存储的是什么?
索引存储了指向表中某一行的指针

2.3索引的缺点
以字典为例:字典中真实有效的数据是什么?是这个字的意思、发音等。但是一本字典一般都会包含目录、各种检索页面,可以很直观的看出来,检索页/索引占据了实实在在的空间,这是索引的第一个缺点,占据空间
如果字典中新加一个字,那么就需要去同步更新各个检索页,也就是说比单纯的插入数据要多消耗一些时间和性能。


3.常见问题

什么情况下需要对该字段建立索引?
如果表中某列在查询过程中使用的非常频繁,那就在该列上创建索引。

对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,增加索引,反而降低了系统的维护速度和增大了空间需求

详细点说
① 总的来说就是数据量大的,经常进行查询操作的表要建立索引
② 表中字段建立索引应该遵循几个原则:

1) 越小的数据类型通常更好:越小的数据类型通常在磁盘、内存中都需要更少的空间,处理起来更快。
2) 简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂,处理起来也更耗时。
3) 尽量避免NULL:应该指定列为NOT NULL。含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。
4) 对非唯一的字段,例如“性别”这种大量重复值的字段,增加索引也没有什么意义,所以索引的建立应当更多的选取唯一性更高的字段。

4.编码实战

4.1千万级数据插入索引,耗时228s

mysql> create index idx_name on student_info_five (name);
Query OK, 0 rows affected (228.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

4.2千万级数据索引占据的空间大小 192M

mysql> use information_schema;
Database changed
mysql> select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as data_size,
concat(round(sum(MAX_DATA_LENGTH/1024/1024),2),'MB') as max_data_size,
concat(round(sum(INDEX_LENGTH/1024/1024),2),'MB') as index_size,
concat(round(sum(DATA_FREE/1024/1024),2),'MB') as data_free
from TABLES where table_schema='index_test' and table_name='student_info_five';
+-----------+---------------+------------+-----------+
| data_size | max_data_size | index_size | data_free |
+-----------+---------------+------------+-----------+
| 1412.00MB | 0.00MB        | 192.81MB   | 34.00MB   |
+-----------+---------------+------------+-----------+

4.3千万级数据 有索引的情况下 检索时间 0.33s

mysql> use index_test;
Database changed
mysql> select * from student_info_five where name='冀卯卯';
+---------+----------+-------+--------+--------+------------+---------+------------+------------+--------+----------------------+----------+----------+--------+---------------+---------------+
| id      | location | level | lesson | name   | qq         | job     | start_time | university | number | link                 | target   | brother  | source | create_at     | update_at     |
+---------+----------+-------+--------+--------+------------+---------+------------+------------+--------+----------------------+----------+----------+--------+---------------+---------------+
|       1 |        5 |     0 |      4 | 冀卯卯 |  596191837 | android |     123456 | 北大       |   6554 | http://www.baidu.com | 天道酬勤 | 荆寅未   | 百度   | 1523602568434 | 1523602571296 |
|  195441 |        0 |     3 |      6 | 冀卯卯 |   92292840 | ios     |     123456 | 武大       |   7808 | http://www.baidu.com | 天道酬勤 | 俞午午   | 百度   | 1523602552668 | 1523602581207 |
|  391381 |        2 |     5 |      2 | 冀卯卯 |  418002865 | java    |     123456 | 西交       |    261 | http://www.baidu.com | 天道酬勤 | 查酉乙   | 百度   | 1523602566762 | 1523602584822 |
|  441927 |        4 |     5 |      4 | 冀卯卯 | 3924510098 | web     |     123456 | 东南       |    257 | http://www.baidu.com | 天道酬勤 | 蓬戌子   | qq     | 1523602581809 | 1523602599521 |
|  469179 |        3 |     4 |      1 | 冀卯卯 |  511661427 | web     |     123456 | 东南       |   8190 | http://www.baidu.com | 天道酬勤 | 逯葵壬   | qq     | 1523602588380 | 1523602589324 |
|  982495 |        7 |     1 |      5 | 冀卯卯 |  432195213 | ios     |     123456 | 西交       |   9465 | http://www.baidu.com | 天道酬勤 | 澹台午己 | 百度   | 1523602606833 | 1523602608459 |
| 1071734 |        6 |     0 |      3 | 冀卯卯 | 9070362047 | web     |     123456 | 西交       |    367 | http://www.baidu.com | 天道酬勤 | 彭葵亥   | 百度   | 1523602604152 | 1523602612739 |
| 1586831 |        1 |     0 |      2 | 冀卯卯 |  295327589 | java    |     123456 | 武大       |   8649 | http://www.baidu.com | 天道酬勤 | 陆葵火   | 知乎   | 1523602625061 | 1523602633566 |
| 1815366 |        4 |     3 |      0 | 冀卯卯 |  523475976 | java    |     123456 | 西交       |   8831 | http://www.baidu.com | 天道酬勤 | 卞金辛   | 知乎   | 1523602642543 | 1523602643440 |
| 2020934 |        2 |     2 |      3 | 冀卯卯 |  506215379 | java    |     123456 | 郑大       |   8117 | http://www.baidu.com | 天道酬勤 | 苗乙丁   | 知乎   | 1523602650280 | 1523602660180 |
| 2077051 |        6 |     1 |      4 | 冀卯卯 |  101569042 | java    |     123456 | 北大       |    633 | http://www.baidu.com | 天道酬勤 | 蓝庚寅   | 知乎   | 1523602618423 | 1523602654568 |
| 2237802 |        4 |     3 |      5 | 冀卯卯 |  304691871 | UI      |     123456 | 北大       |    557 | http://www.baidu.com | 天道酬勤 | 印木壬   | qq     | 1523602655508 | 1523602686660 |
| 3083824 |        6 |     0 |      3 | 冀卯卯 |  950365890 | qa      |     123456 | 东南       |    711 | http://www.baidu.com | 天道酬勤 | 柯戌土   | 百度   | 1523602688950 | 1523602741658 |
| 3450388 |        4 |     5 |      2 | 冀卯卯 |  430550754 | qa      |     123456 | 清华       |   2093 | http://www.baidu.com | 天道酬勤 | 屠丁未   | qq     | 1523602696436 | 1523602706336 |
| 3512742 |        0 |     3 |      5 | 冀卯卯 |  601841892 | web     |     123456 | 武大       |   1728 | http://www.baidu.com | 天道酬勤 | 堵丑金   | qq     | 1523602682152 | 1523602709530 |
| 3663546 |        3 |     0 |      6 | 冀卯卯 | 7020377374 | UI      |     123456 | 郑大       |   9465 | http://www.baidu.com | 天道酬勤 | 谷丁庚   | 知乎   | 1523602691418 | 1523602761502 |
| 4029116 |        6 |     2 |      5 | 冀卯卯 | 9877508425 | java    |     123456 | 上交       |   7499 | http://www.baidu.com | 天道酬勤 | 家未丑   | 知乎   | 1523602721829 | 1523602729647 |
| 4098567 |        4 |     0 |      6 | 冀卯卯 | 2763912410 | ios     |     123456 | 北大       |   9281 | http://www.baidu.com | 天道酬勤 | 宓土丑   | 百度   | 1523602697059 | 1523602740619 |
| 4546314 |        5 |     1 |      6 | 冀卯卯 |  570947147 | UI      |     123456 | 上交       |   9484 | http://www.baidu.com | 天道酬勤 | 鄂己木   | 知乎   | 1523602746256 | 1523602754581 |
| 4733358 |        2 |     5 |      2 | 冀卯卯 |  922897182 | java    |     123456 | 上交       |   2680 | http://www.baidu.com | 天道酬勤 | 易乙未   | 百度   | 1523602758596 | 1523602785146 |
| 4827423 |        3 |     5 |      6 | 冀卯卯 |   13065260 | web     |     123456 | 北大       |   1425 | http://www.baidu.com | 天道酬勤 | 强午壬   | qq     | 1523602762385 | 1523602810505 |
| 5118823 |        2 |     1 |      0 | 冀卯卯 |  689173487 | android |     123456 | 东南       |   7207 | http://www.baidu.com | 天道酬勤 | 赵卯甲   | 知乎   | 1523602761424 | 1523602792544 |
| 5840791 |        4 |     5 |      3 | 冀卯卯 |   29584286 | java    |     123456 | 东南       |    951 | http://www.baidu.com | 天道酬勤 | 车辰水   | 百度   | 1523602795710 | 1523602809512 |
| 6693724 |        6 |     3 |      1 | 冀卯卯 |  397860137 | qa      |     123456 | 西交       |   2226 | http://www.baidu.com | 天道酬勤 | 谈申午   | 知乎   | 1523602820286 | 1523602841265 |
| 6851018 |        0 |     5 |      5 | 冀卯卯 |  853556610 | web     |     123456 | 上交       |    526 | http://www.baidu.com | 天道酬勤 | 蓬壬巳   | qq     | 1523602822889 | 1523602861640 |
| 7127243 |        4 |     3 |      2 | 冀卯卯 |   95233650 | UI      |     123456 | 西交       |   9336 | http://www.baidu.com | 天道酬勤 | 乌金未   | qq     | 1523602845817 | 1523602870297 |
| 7167282 |        5 |     2 |      0 | 冀卯卯 |   92162052 | web     |     123456 | 武大       |    828 | http://www.baidu.com | 天道酬勤 | 邰丑丁   | qq     | 1523602838261 | 1523602859330 |
| 7171768 |        2 |     2 |      1 | 冀卯卯 | 7881801474 | python  |     123456 | 清华       |    767 | http://www.baidu.com | 天道酬勤 | 仲孙金丁 | 百度   | 1523602856180 | 1523602876468 |
| 7327958 |        0 |     5 |      3 | 冀卯卯 | 7924078413 | web     |     123456 | 西交       |   5176 | http://www.baidu.com | 天道酬勤 | 龙火葵   | 百度   | 1523602860736 | 1523602872836 |
| 7352163 |        2 |     1 |      0 | 冀卯卯 | 4079120276 | UI      |     123456 | 武大       |   7580 | http://www.baidu.com | 天道酬勤 | 蔺丑丁   | 知乎   | 1523602848504 | 1523602872336 |
| 7721942 |        5 |     1 |      0 | 冀卯卯 | 9188092016 | android |     123456 | 东南       |   7547 | http://www.baidu.com | 天道酬勤 | 雍未木   | 知乎   | 1523602881503 | 1523602912511 |
| 7798165 |        4 |     2 |      4 | 冀卯卯 |  721324256 | android |     123456 | 西交       |   8651 | http://www.baidu.com | 天道酬勤 | 能乙葵   | 百度   | 1523602877853 | 1523602907100 |
| 7919698 |        4 |     5 |      4 | 冀卯卯 |  756017402 | qa      |     123456 | 清华       |   5859 | http://www.baidu.com | 天道酬勤 | 梅乙木   | qq     | 1523602870593 | 1523602907173 |
| 7948301 |        8 |     4 |      3 | 冀卯卯 | 7493899797 | ios     |     123456 | 上交       |   9614 | http://www.baidu.com | 天道酬勤 | 景巳水   | qq     | 1523602874783 | 1523602902663 |
| 8263376 |        4 |     2 |      5 | 冀卯卯 |  670759747 | UI      |     123456 | 北大       |    617 | http://www.baidu.com | 天道酬勤 | 闾丘己申 | 知乎   | 1523602900768 | 1523602919092 |
+---------+----------+-------+--------+--------+------------+---------+------------+------------+--------+----------------------+----------+----------+--------+---------------+---------------+
35 rows in set (0.33 sec)

4.4千万级数据 无索引情况下 检索时间 20.74s

mysql> DROP INDEX idx_name ON student_info_five;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from student_info_five where name='冀卯卯';
+---------+----------+-------+--------+--------+------------+---------+------------+------------+--------+----------------------+----------+----------+--------+---------------+---------------+
| id      | location | level | lesson | name   | qq         | job     | start_time | university | number | link                 | target   | brother  | source | create_at     | update_at     |
+---------+----------+-------+--------+--------+------------+---------+------------+------------+--------+----------------------+----------+----------+--------+---------------+---------------+
|       1 |        5 |     0 |      4 | 冀卯卯 |  596191837 | android |     123456 | 北大       |   6554 | http://www.baidu.com | 天道酬勤 | 荆寅未   | 百度   | 1523602568434 | 1523602571296 |
|  195441 |        0 |     3 |      6 | 冀卯卯 |   92292840 | ios     |     123456 | 武大       |   7808 | http://www.baidu.com | 天道酬勤 | 俞午午   | 百度   | 1523602552668 | 1523602581207 |
|  391381 |        2 |     5 |      2 | 冀卯卯 |  418002865 | java    |     123456 | 西交       |    261 | http://www.baidu.com | 天道酬勤 | 查酉乙   | 百度   | 1523602566762 | 1523602584822 |
|  441927 |        4 |     5 |      4 | 冀卯卯 | 3924510098 | web     |     123456 | 东南       |    257 | http://www.baidu.com | 天道酬勤 | 蓬戌子   | qq     | 1523602581809 | 1523602599521 |
|  469179 |        3 |     4 |      1 | 冀卯卯 |  511661427 | web     |     123456 | 东南       |   8190 | http://www.baidu.com | 天道酬勤 | 逯葵壬   | qq     | 1523602588380 | 1523602589324 |
|  982495 |        7 |     1 |      5 | 冀卯卯 |  432195213 | ios     |     123456 | 西交       |   9465 | http://www.baidu.com | 天道酬勤 | 澹台午己 | 百度   | 1523602606833 | 1523602608459 |
| 1071734 |        6 |     0 |      3 | 冀卯卯 | 9070362047 | web     |     123456 | 西交       |    367 | http://www.baidu.com | 天道酬勤 | 彭葵亥   | 百度   | 1523602604152 | 1523602612739 |
| 1586831 |        1 |     0 |      2 | 冀卯卯 |  295327589 | java    |     123456 | 武大       |   8649 | http://www.baidu.com | 天道酬勤 | 陆葵火   | 知乎   | 1523602625061 | 1523602633566 |
| 1815366 |        4 |     3 |      0 | 冀卯卯 |  523475976 | java    |     123456 | 西交       |   8831 | http://www.baidu.com | 天道酬勤 | 卞金辛   | 知乎   | 1523602642543 | 1523602643440 |
| 2020934 |        2 |     2 |      3 | 冀卯卯 |  506215379 | java    |     123456 | 郑大       |   8117 | http://www.baidu.com | 天道酬勤 | 苗乙丁   | 知乎   | 1523602650280 | 1523602660180 |
| 2077051 |        6 |     1 |      4 | 冀卯卯 |  101569042 | java    |     123456 | 北大       |    633 | http://www.baidu.com | 天道酬勤 | 蓝庚寅   | 知乎   | 1523602618423 | 1523602654568 |
| 2237802 |        4 |     3 |      5 | 冀卯卯 |  304691871 | UI      |     123456 | 北大       |    557 | http://www.baidu.com | 天道酬勤 | 印木壬   | qq     | 1523602655508 | 1523602686660 |
| 3083824 |        6 |     0 |      3 | 冀卯卯 |  950365890 | qa      |     123456 | 东南       |    711 | http://www.baidu.com | 天道酬勤 | 柯戌土   | 百度   | 1523602688950 | 1523602741658 |
| 3450388 |        4 |     5 |      2 | 冀卯卯 |  430550754 | qa      |     123456 | 清华       |   2093 | http://www.baidu.com | 天道酬勤 | 屠丁未   | qq     | 1523602696436 | 1523602706336 |
| 3512742 |        0 |     3 |      5 | 冀卯卯 |  601841892 | web     |     123456 | 武大       |   1728 | http://www.baidu.com | 天道酬勤 | 堵丑金   | qq     | 1523602682152 | 1523602709530 |
| 3663546 |        3 |     0 |      6 | 冀卯卯 | 7020377374 | UI      |     123456 | 郑大       |   9465 | http://www.baidu.com | 天道酬勤 | 谷丁庚   | 知乎   | 1523602691418 | 1523602761502 |
| 4029116 |        6 |     2 |      5 | 冀卯卯 | 9877508425 | java    |     123456 | 上交       |   7499 | http://www.baidu.com | 天道酬勤 | 家未丑   | 知乎   | 1523602721829 | 1523602729647 |
| 4098567 |        4 |     0 |      6 | 冀卯卯 | 2763912410 | ios     |     123456 | 北大       |   9281 | http://www.baidu.com | 天道酬勤 | 宓土丑   | 百度   | 1523602697059 | 1523602740619 |
| 4546314 |        5 |     1 |      6 | 冀卯卯 |  570947147 | UI      |     123456 | 上交       |   9484 | http://www.baidu.com | 天道酬勤 | 鄂己木   | 知乎   | 1523602746256 | 1523602754581 |
| 4733358 |        2 |     5 |      2 | 冀卯卯 |  922897182 | java    |     123456 | 上交       |   2680 | http://www.baidu.com | 天道酬勤 | 易乙未   | 百度   | 1523602758596 | 1523602785146 |
| 4827423 |        3 |     5 |      6 | 冀卯卯 |   13065260 | web     |     123456 | 北大       |   1425 | http://www.baidu.com | 天道酬勤 | 强午壬   | qq     | 1523602762385 | 1523602810505 |
| 5118823 |        2 |     1 |      0 | 冀卯卯 |  689173487 | android |     123456 | 东南       |   7207 | http://www.baidu.com | 天道酬勤 | 赵卯甲   | 知乎   | 1523602761424 | 1523602792544 |
| 5840791 |        4 |     5 |      3 | 冀卯卯 |   29584286 | java    |     123456 | 东南       |    951 | http://www.baidu.com | 天道酬勤 | 车辰水   | 百度   | 1523602795710 | 1523602809512 |
| 6693724 |        6 |     3 |      1 | 冀卯卯 |  397860137 | qa      |     123456 | 西交       |   2226 | http://www.baidu.com | 天道酬勤 | 谈申午   | 知乎   | 1523602820286 | 1523602841265 |
| 6851018 |        0 |     5 |      5 | 冀卯卯 |  853556610 | web     |     123456 | 上交       |    526 | http://www.baidu.com | 天道酬勤 | 蓬壬巳   | qq     | 1523602822889 | 1523602861640 |
| 7127243 |        4 |     3 |      2 | 冀卯卯 |   95233650 | UI      |     123456 | 西交       |   9336 | http://www.baidu.com | 天道酬勤 | 乌金未   | qq     | 1523602845817 | 1523602870297 |
| 7167282 |        5 |     2 |      0 | 冀卯卯 |   92162052 | web     |     123456 | 武大       |    828 | http://www.baidu.com | 天道酬勤 | 邰丑丁   | qq     | 1523602838261 | 1523602859330 |
| 7171768 |        2 |     2 |      1 | 冀卯卯 | 7881801474 | python  |     123456 | 清华       |    767 | http://www.baidu.com | 天道酬勤 | 仲孙金丁 | 百度   | 1523602856180 | 1523602876468 |
| 7327958 |        0 |     5 |      3 | 冀卯卯 | 7924078413 | web     |     123456 | 西交       |   5176 | http://www.baidu.com | 天道酬勤 | 龙火葵   | 百度   | 1523602860736 | 1523602872836 |
| 7352163 |        2 |     1 |      0 | 冀卯卯 | 4079120276 | UI      |     123456 | 武大       |   7580 | http://www.baidu.com | 天道酬勤 | 蔺丑丁   | 知乎   | 1523602848504 | 1523602872336 |
| 7721942 |        5 |     1 |      0 | 冀卯卯 | 9188092016 | android |     123456 | 东南       |   7547 | http://www.baidu.com | 天道酬勤 | 雍未木   | 知乎   | 1523602881503 | 1523602912511 |
| 7798165 |        4 |     2 |      4 | 冀卯卯 |  721324256 | android |     123456 | 西交       |   8651 | http://www.baidu.com | 天道酬勤 | 能乙葵   | 百度   | 1523602877853 | 1523602907100 |
| 7919698 |        4 |     5 |      4 | 冀卯卯 |  756017402 | qa      |     123456 | 清华       |   5859 | http://www.baidu.com | 天道酬勤 | 梅乙木   | qq     | 1523602870593 | 1523602907173 |
| 7948301 |        8 |     4 |      3 | 冀卯卯 | 7493899797 | ios     |     123456 | 上交       |   9614 | http://www.baidu.com | 天道酬勤 | 景巳水   | qq     | 1523602874783 | 1523602902663 |
| 8263376 |        4 |     2 |      5 | 冀卯卯 |  670759747 | UI      |     123456 | 北大       |    617 | http://www.baidu.com | 天道酬勤 | 闾丘己申 | 知乎   | 1523602900768 | 1523602919092 |
+---------+----------+-------+--------+--------+------------+---------+------------+------------+--------+----------------------+----------+----------+--------+---------------+---------------+
35 rows in set (20.74 sec)

5.扩展思考

多大的数据量级下建索引会有性能差别
10w条数据的情况下,索引的性能就能体现的很明显了


6.参考文献

https://blog.csdn.net/weiliangliang111/article/details/51333169
https://blog.csdn.net/miracleww/article/details/53352738
https://www.cnblogs.com/gym333/p/6877023.html


7.更多讨论

Q:数据量是多少的时候建议建立索引?
A:没有一个固定的标准。
数据库字段值的取值是否单一
数据库查询频率和增删改频率
以上两者都会影响索引
单从数据量讲,我觉得表格内容有10w建议建立索引
Q:如果数据库中有很多字段,索引越多,查询得越快吗?
A:不考虑多条件查询的话,索引之间是没有必然联系的。只要查询内容所在的列建立了索引,查询的速度就会提升
Q:多条件查询的时候会降低sql语句执行速度么,比如我要查某某分院的某某人,那我还需要给分院建立索引然后多条件查询更快么?
A:多条件查询,可以使用联合索引(复合索引)。

PPT在这里

感谢大家观看!

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

猜你喜欢

转载自blog.csdn.net/zhanlijueduan/article/details/79935632