mysql分区怎么建索引 闲不住的奶奶选材料

mysql数据库怎么建索引?MySQL数据库建立索引步骤mysql分区怎么建索引:
1、使用SQLPlus或者PLSQL登录MySQL数据库 。
2、执行语句create index indexname on table(col) tablespace tablespacename;其中
"indexname"为需要建立索引mysql分区怎么建索引的索引名mysql分区怎么建索引;
"table"是需要建立索引的表mysql分区怎么建索引;
"col"为需要建立索引的字段列;
”tablespacename“为建立索引存放的空间(如果不需要制定表空间则使用“create index indexname on table(col)”) 。
Mysql建立索引经验在实际开发中使用数据库时,难免会遇到一些大表数据,对这些数据进行查询时,有时候SQL会查询得特别慢,这时候 , 有经验的老师傅会告诉你,你看一下哪几个字段查的多,加一个索引就好了 。
那么 , 怎么合理地建立索引呢?这里分享一下我的一些经验,如有不妥之处,欢迎批评指正 。
1、不要盲目建立索引 ,先分析再创建
索引虽然能大幅度提升我们的查询性能,但也要知道,在你进行增删改时,索引树也要同样地进行维护 。所以 , 索引不是越多越好 , 而是按需建立 。最好是在一整块模块开发完成后 , 分析一下,去针对大多数的查询,建立联合索引 。
2、使用联合索引尽量覆盖多的条件
这是说在一个慢sql里假如有五个where,一个 order by,那么我们的联合索引尽量覆盖到这五个查询条件,如果有必要,order by 也覆盖上。
3、小基数字段不需要索引
这个意思是 , 如果一张表里某个字段的值只有那么几个,那么你针对这个字段建立的索引其实没什么意义,比如说,一个性别字段就两种结果,你建了索引,排序也没什么意思(也就是索引里把男女给分开了)
所以说 , 索引尽量选择基数大的数据去建立,能最大化地利用索引
4、长字符串可以使用前缀索引
我们建立索引的字段尽量选择字段类型较小的,比如一个varchar(20)和varchar(256)的,我们在20的上面建立的索引和在256上就有明显的差距(字符串那么长排序也不好排呀,唉) 。
当然,如果一定是要对varchar(256)建立索引,我们可以选择里面的前20个字符放在索引树里(这里的20不绝对 , 选择能尽量分辨数据的最小字符字段设计),类似这样KEY index(name(20),age,job),索引只会对name的前20个字符进行搜索,但前缀索引无法适用于order by 和 group by 。
5、对排序字段设计索引的优先级低
如果一个SQL里我们出现了范围查找 , 后边又跟着一个排序字段,那么我们优先给范围查找的字段设置索引,而不是优先排序 。
6、如果出现慢SQL,可以设计一个只针对该条SQL的联合索引 。
不过慢SQL的优化,需要一步步去进行分析,可以先用explain查看SQL语句的分析结果 , 再针对结果去做相应的改进 。explain的东西我们下次再讲 。
PS:在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返回执行计划的信息 , 而不是 执行这条SQL 。
mysql怎么建立索引我们可以通过查看索引的属性来判断创建索引的方法 。
查看索引的语法格式如下mysql分区怎么建索引:
SHOW INDEX FROM 表名 [ FROM 数据库名]
语法说明如下:
表名:指定需要查看索引的数据表名 。
数据库名:指定需要查看索引的数据表所在的数据库mysql分区怎么建索引,可省略 。比如,SHOW INDEX FROM student FROM test; 语句表示查看 test 数据库中 student 数据表的索引 。
示例
使用 SHOW INDEX 语句查看《MySQL创建索引》一节中 tb_stu_info2 数据表的索引信息,SQL 语句和运行结果如下所示 。
mysql SHOW INDEX FROM tb_stu_info2\G
1. row
Table: tb_stu_info2
Non_unique: 0
Key_name: height
Seq_in_index: 1
Column_name: height
Collation: A
Cardinality: 0
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
1 row in set (0.03 sec)
其中各主要参数说明如下:
参数 说明
Table 表示创建索引的数据表名,这里是 tb_stu_info2 数据表 。
Non_unique 表示该索引是否是唯一索引 。若不是唯一索引 , 则该列的值为 1;若是唯一索引,则该列的值为 0 。
Key_name 表示索引的名称 。
Seq_in_index 表示该列在索引中的位置,如果索引是单列的 , 则该列的值为 1;如果索引是组合索引,则该列的值为每列在索引定义中的顺序 。
Column_name 表示定义索引的列字段 。
Collation 表示列以何种顺序存储在索引中 。在 MySQL 中,升序显示值“A”(升序) , 若显示为 NULL,则表示无分类 。
Cardinality 索引中唯一值数目的估计值 。基数根据被存储为整数的统计数据计数,所以即使对于小型表,该值也没有必要是精确的 。基数越大,当进行联合时,MySQL 使用该索引的机会就越大 。
Sub_part 表示列中被编入索引的字符的数量 。若列只是部分被编入索引,则该列的值为被编入索引的字符的数目;若整列被编入索引,则该列的值为 NULL 。
Packed 指示关键字如何被压缩 。若没有被压缩 , 值为 NULL 。
Null 用于显示索引列中是否包含 NULL 。若列含有 NULL , 该列的值为 YES 。若没有,则该列的值为 NO 。
Index_type 显示索引使用的类型和方法(BTREE、FULLTEXT、HASH、RTREE) 。
Comment 显示评注 。
Mysql建索引的注意事项1.最左前缀匹配原则,非常重要的原则 , mysql会一直向右匹配直到遇到范围查询(、、between、like)就停止匹配,比如a = 1 and b = 2 and c3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整 。
2.=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序 , mysql的查询优化器会帮你优化成索引可以识别的形式 。
3.尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少 , 唯一键的区分度是1 , 而一些状态、性别字段可能在大数据面前区分度就是0,那可能有人会问 , 这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录 。
4.索引列不能参与计算,保持列“干净”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引 , 原因很简单,b 树中存的都是数据表中的字段值 , 但进行检索时,需要把所有元素都应用函数才能比较,显然成本太大 。所以语句应该写成create_time = unix_timestamp(’2014-05-29’) 。
5.尽量的扩展索引,不要新建索引 。比如表中已经有a的索引 , 现在要加(a,b)的索引 , 那么只需要修改原来的索引即可 。
1."一个顶三个" 。建了一个(a,b,c)的复合索引,那么实际等于建了(a),(a,b),(a,b,c)三个索引,因为每多一个索引,都会增加写操作的开销和磁盘空间的开销 。对于大量数据的表,这可是不小的开销!
2.覆盖索引 。同样的有复合索引(a,b,c) , 如果有如下的sql: select a,b,c from table where a=1 and b = 1 。那么MySQL可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机io操作 。减少io操作,特别的随机io其实是dba主要的优化策略 。所以,在真正的实际应用中,覆盖索引是主要的提升性能的优化手段之一
3.索引列越多,通过索引筛选出的数据越少 。有1000W条数据的表 , 有如下sql:select * from table where a = 1 and b =2 and c = 3,假设假设每个条件可以筛选出10%的数据 , 如果只有单值索引,那么通过该索引能筛选出1000W*10%=100w 条数据,然后再回表从100w条数据中找到符合b=2 and c= 3的数据,然后再排序,再分页;如果是复合索引,通过索引筛选出1000w *10% *10% *10%=1w , 然后再排序、分页,哪个更高效,一眼便知
高性能MySQL:快速创建MyISAM索引快速创建MyISAM 索引
在现代版本的InnoDB 版本中 有一个类似的技巧 这依赖于InnoDB 的快速在线索引创建功能 这个技巧是 先删除所有的非唯一索引 然后增加新的列 最后重新创建删除掉的索引 Percona Server 可以自动完成这些操作步骤
也可以使用像前面说的ALTER TABLE 的骇客方法来加速这个操作 但需要多做一些工作并且承担一定的风险 这对从备份中载入数据是很有用的 例如 当已经知道所有数据都是有效的并且没有必要做唯一性检查时就可以这么来操作
再次说明 这是没有文档说明并且不受官方支持的技巧 若使用的话 需要自己承担风险 并且操作之前一定要先备份数据
下面是操作步骤
用需要的表结构创建一张表 但是不包括索引
载入数据到表中以构建 MYD 文件
按照需要的结构创建另外一张空表 这次要包含索引 这会创建需要的 frm 和 MYI文件
获取读锁并刷新表
重命名第二张表的 frm 和 MYI 文件 让MySQL 认为是第一张表的文件
释放读锁
使用REPAIR TABLE 来重建表的索引 该操作会通过排序来构建所有索引 包括唯一索引
这个操作步骤对大表来说会快很多
返回目录高性能MySQL
编辑推荐
ASP NET MVC 框架揭秘
Oracle索引技术
ASP NET开发培训视频教程
lishixinzhi/Article/program/MySQL/201311/29670
Mysql分区表时候索引如何进行存储正常MySQL底层存储索引默认使用的是B 树,但是如果设立了分区表的情况下,他的底层是如何进行存储的呢?
查看MySQL对应的自己电脑上面的安装目录下,是有一个ibd文件,用innblock和bcview两个小工具,(github上可以搜到),便可以实现对ibd文件的查看,通过对比着没有设立分区的表的ibd文件,就可以看出来
分区表会将索引分成分区个个数的索引树来存储索引,也就是分开存储 。
【mysql分区怎么建索引 闲不住的奶奶选材料】关于mysql分区怎么建索引和闲不住的奶奶选材料的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读