设置索引的原则是什么_设置索引的原则是什么
2025-01-05 05:55 - 立有生活网
建立sql索引应该遵循什么原则
索引字段建议建立NOT NULL约束
设置索引的原则是什么_设置索引的原则是什么
设置索引的原则是什么_设置索引的原则是什么
设置索引的原则是什么_设置索引的原则是什么
经常与其他表进行连接的表,在连接字段上应该建立索引;
经常出现在Where子句中的字段且过滤性很强的,特别是大表的字段,应该建立索引;
可选择性高的关键字 ,应该建立索引;
可选择性低的关键字,但数据的值分布异很大时,选择性数据比较少时仍然可以利用索引提高效率
复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
A、正确选择复合索引中的个字段,一般是选择性较好的且在where子句中常用的字段上;
B、复合索引的几个字段经常同时以AND方式出现在Where子句中可以建立复合索引;否则单字段索引;
C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
频繁DML的表,不要建立太多的索引;
不要将那些频繁修改的列作为索引列;
2018年全国计算机二级MySQL章节知识点:Mysql索引的三个原则
2018年全国计算机二级MySQL章节知识点:Mysql索引的三个原则
一,索引的重要性
索引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行。表越大,花费的时间越多。如果表中查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要看所有数据。注意如果你需要访问大部分行,顺序读取要快得多,因为此时我们避免磁盘搜索。
如你用新华字典来查找“张”这个汉字,不使用目录的话,你可能要从新华字典的页找到后一页,可能要花二个小时。字典越厚呢,你花的时间就越多。现在你使用目录来查找“张”这个汉字,张的首字母是z,z开头的汉字从900多页开始,有了这条线索,你查找一个汉字可能只要一分钟,由此可见索引的重要性。但是索引建的是不是越多越好呢,当然不是,如果一本书的目录分成好几级的话,我想你也会晕的。
二,准备工作
//准备二张测试表
mysql> CREATE TABLE `test_t` (
-> `id` int(11) NOT NULL auto_increment,
-> `num` int(11) NOT NULL default '0',
-> `d_num` varchar(30) NOT NULL default '0',
-> PRIMARY KEY (`id`)
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Query OK, 0 rows affected (0.05 sec)
mysql> CREATE TABLE `test_test` (
-> `id` int(11) NOT NULL auto_increment,
-> `num` int(11) NOT NULL default '0',
-> PRIMARY KEY (`id`)
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Query OK, 0 rows affected (0.05 sec)
//创建一个存储过程,为插数据方便
mysql> delimiter |
mysql> create procedure i_test(pa int(11),tab varchar(30))
-> begin
-> declare max_num int(11) default 100000;
-> declare i int default 0;
-> declare rand_num int;
-> declare double_num char;
->
-> if tab != 'test_test' then
->selectcount(id) into max_num from test_t;
-> while i < pa do
-> if max_num < 100000 then
-> select cast(rand()100 as unsigned) into rand_num;
-> select concat(rand_num,rand_num) into double_num;
-> insert into test_t(num,d_num)values(rand_num,double_num);
-> end if;
-> set i = i +1;
-> end while;
-> else
-> select count(id) into max_num from test_test;
-> while i < pa do
-> if max_num < 100000 then
-> select cast(rand()100 as unsigned) into rand_num;
-> insert into test_test(num)values(rand_num);
-> end if;
-> set i = i +1;
-> end while;
-> end if;
-> end|
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> show variables like "%pro%"; //查看一下,记录执行的profiling是不是开启动了,默认是不开启的
+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| profiling | OFF |
| profiling_history_size | 15 |
| protocol_version | 10 |
| sle_compressed_protocol | OFF |
+---------------------------+-------+
4 rows in set (0.00 sec)
mysql> set profiling=1; //开启后,是为了对比加了索引后的执行时间
Query OK, 0 rows affected (0.00 sec)
数据库中创建引索应遵循哪些原则
1.首先:你用的是什么数据库?
2.其次:你是否把name做了 主键?
3.如果:SQL数据库,name也做了 主键。
4.做法:把name的主键取消(此时会自动取消重复的限制),增加一个 自动字段做主键;
5.如果是 DBF数据库,关闭数据库后,直接删除 索引文件,再打开即可。
在SQL数据库中设置索引的原则是什么?(注意是设置不是创建)
我经常用的是sqlserver自带的优化功能 数据库设计好 程序编好测试运行时把跟踪开开 然后把所有的放到查询分析器中就可以自动优化了 常用的索引就会自动加上 一般能优化90%左右
建立索引应该遵循什么原则
建立索引的原则:
(1
)定义有主键的数据列一定要建立索引。因为主键可以加速定位到表中的某一行
(2
)定义有外间的数据列一定要建立索引。外键列通常用于表与表之间的连接,在其上创
建索引可以加快表间的连接。
(3
)对于经常查询的数据列建立索引。
充分的原则
数据库创建索引的原则
核心原则就一句话: 在Where语句中出现频繁出现的字段上做索引
1、主键列数据库会自动创建索引
2、10万条以上就创建索引吧。
3、如果太多条就想点别的招,比如分区,分表等
索引的使用规则和设计考虑
当我们建立好一个联合索引之后,我们的SQL语句要怎么写,才能让他的查询使用到我们建立好的索引呢?
索引基本的规则就是等值匹配了,就是where条件里的查询条件字段和联合索引的字段完全一样,都是基于等于来匹配的。
左侧列匹配 ,如我们设计的索引是INDEX(class_name, student_name, course_name),查询的SQL语句where里不一定要根据三个字段来查询,只要左侧的部分字段来查,就可以了
比如:select from student_score where class_name='xx' and student_name='xx',只有class_name和student_name可以在索引里搜索,就可以查询某个学生所有科目的成绩。
但如果你SQL是select from where course_name='xx’,那就不能走索引了,因为B+树里必须先按class_name查找,再按student_name查找,不能跳过前面两个字段。
左侧匹配规则 ,如你要用like语法来查,比如select from student_socre where class_name like '1%',查找所有1开头的班级的分数,那么也是可以用索引的。
因为你的联合索引的B+树里,是按照class_name排序的,所以你要是给出class_name的左前缀就是1,然后后面的给一个模糊匹配符号,那也是可以基于索引来查找的。
但如果你where条件是class_name like '%班',左侧是模糊查询,就没法用索引了。
范围查找 ,如你查询的SQL是:select from student_score where class_name>'1班’ and class_name<'5班',查找几个班的分数。也是可以用到索引的。
因为我们的索引的下层的数据页都是按顺序组成双向链表的,所以完全可以先找到'1班'对应的数据页,再找到'5班'对应的数据页,两个数据页中间的那些数据页,就全都是在你范围内的数据了!
ORDER BY如何使用上索引?
设你有一个查询:select from table where xxx=xxx order by xxx,似乎应该是基于where语句通过索引快速筛选出来一波数据,接着放到内存里,或者放在一个临时磁盘文件里,然后通过排序算法按照某个字段来一个排序,后把排序好的数据返回。
如果是这样的话,肯定就会比较慢,所以别这么搞。
尤其是类似于select from table order by xx1,xx2,xx3 limit 10,这样的SQL语句,查出一批数据后,按照多个字段进行排序,后返回前10条数据,类似的语句其实常常见于分页SQL语句里。
这种情况,我们可以建立一个联合索引INDEX(xx1, xx2, xx3),这时候数据在索引里默认是按照xx1,xx2,xx3排序的,就不需要查出一批数据再在内存里或磁盘里做复杂的排序工作了。
直接拿到10条数据的主键去聚簇索引里回表查询剩下的字段。
所以,你的SQL里是按照联合索引的字段顺序去进行order by排序,这样就可以直接利用联合索引的数据有序性,到索引树里直接按照字段值的顺序去获取数据了。
GROUP BY如何使用上索引?
那设你有这样一个查询:select count() from table group by xx语句,看起来必须先查出一批数据,然后数据放到一个临时磁盘文件里还有加上部分内存,按照指定字段的值分成一组一组的,接着对每一组都执行一个聚合函数,这个性能也是极的,因为毕竟涉及大量的磁盘交互。
在索引树里数据都是按照指定的一些字段都排序好的,其实字段值相同的数据都是在一起的,设要是走索引去执行分组后再聚合,那性能一定比临时磁盘文件去执行好多了。
所以,group by后的字段,也是按照联合索引里左侧的字段开始,按照顺序排列的,这样就可以用上索引来提取一组一组的数据了。
order by和group by用上索引的原理不多,都是依赖索引数据的顺序性。
索引设计的考虑因素
一般建立索引,尽量使用那些区分度比较大的字段 ,那么才能发挥出B+树快速二分查找的优势来。
什么是区分度比较大?
就是你表里一个列的值不同的越多,区分度越大,值不同的越少,区分度越小。比如订单号,订单表每条数据的订单号都不一样,所以它的区分度大,而性别字段一般就男,女,未知,三个值,区分度就比较小。
要是针对区分度小的字段建立索引,会查出一大批数据,没有太大意义。
尽量对字段类型比较小的列设计索引 ,比如说tinyint之类的,因为他的字段类型比较小,说明这个字段自己本身的值占用磁盘空间小,此时你在搜索的时候性能也会比较好一点。
如果你的字段是name VARCHAR(255),你可以针对字段的前20个字符建立索引,就是说,对这个字段的每个值的前20个字符放在索引树里。
但此时,你order by name就没法用上索引了,group by name也是一样的道理。因为你索引树里仅仅包含了前20个字符。
函数与索引
设你设计好了索引,但你SQL里这么写,where sum(xxx)=xx,你给你索引里的字段xxx使用了函数,还能用上索引吗?
不能了,所以尽量不要让你的查询语句里的字段搞什么函数。
现在设计索引的时候需要注意的点都已经讲完了,其实就是好好设计索引,让你的查询语句都能用上索引,同时注意一下字段基数、前缀索引和索引列套函数的问题,尽量让你的查询都能用索引,别因为一些原因用不上索引了。
由于索引本身要占用存储空间,增删改的时候也要维护索引本身,索引一般不要设计太多索引,建议两三个联合索引就应该覆盖掉你这个表的全部查询了。
覆盖索引
一般二级索引的叶子仅仅包含了索引里的几个字段值和主键值,如果你要查询表里的很多字段,就需要回表查询,就是先在二级索引里拿到主键id,再回表根据主键id查出所有字段,这个性能其实也不高。
如果能只在二级索引里查到所有字段,那就完美了,这就要引入覆盖索引的概念了。
覆盖索引不是一种索引,是一种基于索引查询的方式。
设你有查询select xx1,xx2,xx3 from table order by xx1,xx2,xx3这样的语句,这种情况下,你仅仅需要联合索引里的几个字段的值,那么其实就只要扫描联合索引的索引树就可以了,不需要回表去聚簇索引里找其他字段了。
你要查的xx1,xx2,xx3在二级索引里都能提取出来,不需要到聚簇索引里查,这就是覆盖索引。
所以你SQL里指定你仅仅需要的几个字段,不要动不动搞一个select 把所有字段都拿出来,甚至是直接走覆盖索引的方式,不要去回表到聚簇索引。
即使是必须要回表到聚簇索引,那你也尽可能用limit、where之类的语句限定一下回表到聚簇索引的次数,从二级索引里筛选少的数据,然后再回表到聚簇索引里去,这样性能也会好一些。
今日全国钢铁价格行情(今日钢铁价格行情走势
2021年钢材价格会暴跌吗2021钢材价格行情走势分析 钢材价格的涨跌一直都是大家关注的重点话题,钢材价格不断上涨的话,商品房建房成本在增加,农村自建房成本也会增加,最近钢材价格出现了···
述职报告与工作总结的区别(员工述职报告怎么
述职报告与工作总结的区别是什么? 述职报告的结构是格式化的,包括标题、称谓、正文和署名四部分,而工作总结的结构是多种形式的,不局限在格式化,只要主要内容包含基本情况、成绩做法···
我开车撞人了,我全险,除了保险公司赔偿外
我开车撞人了,我全险,除了保险公司赔偿外,我自己还用赔偿吗? 正常来说,不需要你个人单独赔偿,一切都应该是保险公司的赔偿。否则的话,购买了全险,还要自己在赔偿钱,那还买保险有什么用···