大家好,我是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:多条件查询,可以使用联合索引(复合索引)。