mysql数据库如何建立索引,数据库怎么创建索引
内容导航:
一、mysql如何建立索引
我们可以通过查看索引的属性来判断创建索引的方法。查看索引的语法格式如下:SHOW INDEX FROM <表名> [ FROM
<数据库名>]语法说明如下:<表名>:指定需要查看索引的数据表名。<数据库名>:指定需要查看索引的数据表所在的数据库,可省略。比如,SHOW INDEX
FROM student FROM test; 语句表示查看 test 数据库中 student 数据表的索引。示例使用 SHOW INDEX
语句查看《MySQL创建索引》一节中 tb_stu_info2 数据表的索引信息,SQL 语句和运行结果如下所示。mysql> SHOW INDEX
FROM tb_stu_info2\G1. row Table: tb_stu_info2Non_unique: 0Key_name:
heightSeq_in_index: 1Column_name: heightCollation: ACardinality: 0Sub_part:
NULLPacked: NULLNull: YESIndex_type: BTREEComment: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数据库怎么创建索引
普通索引 添加INDEXALTER TABLE table_name
ADD INDEX index_name ( column
)下面演示下给user表的name字段添加一个索引mysql数据库如何创建索引mysql数据库如何创建索引主键索引 添加PRIMARY KEYALTER
TABLE table_name
ADD PRIMARY KEY ( column
)mysql数据库如何创建索引mysql数据库如何创建索引唯一索引 添加UNIQUEALTER TABLE table_name
ADD UNIQUE
( column
)mysql数据库如何创建索引全文索引 添加FULLTEXTALTER TABLE table_name
ADD FULLTEXT
( column
)mysql数据库如何创建索引如何添加多列索引ALTER TABLE table_name
ADD INDEX index_name
( column1
, column2
, column3
)mysql数据库如何创建索引mysql创建数据库命令: databases
//显示数据库 database student(数据库名) //创建数据库student student //进入student数据库 table
studinfo(表名) (sno int primary key,sage int(2)) ………… // 创建表studinfo
table //显示表 ………….. database student //删除student数据库
三、MySQL数据库优化技术之索引使用技巧总结
本文实例总结了MySQL数据库优化技术的索引用法。分享给大家供大家参考,具体如下:
这里紧接上一篇《MySQL数据库优化技术之配置技巧总结》,进一步分析索引优化的技巧:
(七)表的优化
1. 选择合适的数据引擎
MyISAM:适用于大量的读操作的表
InnoDB:适用于大量的写读作的表
2.选择合适的列类型
使用 SELECT * FROM TB_TEST PROCEDURE ANALYSE()可以对这个表的每一个字段进行分析,给出优化列类型建议
3.对于不保存NULL值的列使用NOT NULL,这对你想索引的列尤其重要
4.建立合适的索引
5.使用定长字段,速度比变长要快
(八)建立索引原则
1.合理使用索引
一个Table在一次query中只能使用一个索引,使用EXPLAIN语句来检验优化程序的操作情况
使用analyze帮助优化程序对索引的使用效果做出更准确的预测
2.索引应该创建在搜索、排序、归组等操作所涉及的数据列上
3.尽量将索引建立在重复数据少的数据列中,唯一所以最好
例如:生日列,可以建立索引,但性别列不要建立索引
4.尽量对比较短的值进行索引
降低磁盘IO操作,索引缓冲区中可以容纳更多的键值,提高命中率
如果对一个长的字符串建立索引,可以指定一个前缀长度
5.合理使用多列索引
如果多个条件经常需要组合起来查询,则要使用多列索引(因为一个表一次查询只能使用一个索引,建立多个单列索引也只能使用一个)
6.充分利用最左前缀
也就是要合理安排多列索引中各列的顺序,将最常用的排在前面
7.不要建立过多的索引
只有经常应用于where,order by,group by中的字段需要建立索引.
8.利用慢查询日志查找出慢查询(log-slow-queries, long_query_time)
(九)充分利用索引
1.尽量比较数据类型相同的数据列
2.尽可能地让索引列在比较表达式中独立, WHERE mycol < 4 / 2 使用索引,而WHERE mycol * 2 < 4不使用
3.尽可能不对查询字段加函数,
如:WHERE YEAR(date_col) < 1990改造成WHERE date_col < ‘1990-01-01’
WHERE TO_DAYS(date_col) – TO_DAYS(CURDATE()) < cutoff 改造成WHERE date_col <
DATE_ADD(CURDATE(), INTERVAL cutoff DAY)
4.在LIKE模式的开头不要使用通配符
5.使用straight join可以强制优化器按照FROM子句的次序来进行联结,可以select straight
join,强制所有联结,也可以select * from a straight join b强制两个表的顺序.
6.使用force index强制使用指定的索引.如 select * from song_lib force index(song_name) order
by song_name比不用force index效率高
7.尽量避免使用MySQL自动类型转换,否则将不能使用索引.如将int型的num_col用where num_col=’5′
(十)SQL语句的优化
1.创建合适的统计中间结果表,降低从大表查询数据的几率
2.尽量避免使用子查询,而改用连接的方式.例如:
SELECT , (SELECT MAX(created) FROM posts WHERE author_id = ) AS
latest_postFROM authors a
可以改成:
SELECT , MAX() AS latest_postFROM authors AS aINNER JOIN posts p ON ( =
***.author_id)GROUP BY song_id from song_lib where singer_id in(select
singer_id from singer_libwhere first_char=’A’) limit 2000
改成:
select song_id from song_lib ainner join singer_lib b on _id=_id and
first_char=’A’ limit 2000
3.插入判断重复键时,使用ON DUPLICATE KEY UPDATE :
复制代码 代码如下:insert into db__today(user_id,song_id,action_count) values(1,1,1) ON
DUPLICATE KEY UPDATE action_count=action_count+1;
4.避免使用游标
游标的运行效率极低,可以通过增加临时表,运用多表查询,多表更新等方式完成任务,不要使用游标.
(十一)使用Explain分析SQL语句使用索引的情况
当你在一条SELECT语句前放上关键词EXPLAIN,MySQL解释它将如何处理SELECT,提供有关表如何联结和以什么次序联结的信息,借助于EXPLAIN,可以知道什么时候必须为表加入索引以得到一个使用索引来寻找记录的更快的SELECT,你也能知道优化器是否以一个最佳次序联结表。为了强制优化器对一个SELECT语句使用一个特定联结次序,增加一个STRAIGHT_JOIN子句。
。
EXPLAIN命令的一般语法是:EXPLAIN 如:explain select * from a inner join b on =
EXPLAIN的分析结果参数详解:
:这是表的名字。
:连接操作的类型。
system:表中仅有一条记录(实际应用很少只有一条资料的表)
const:表最多有一个匹配行,用于用常数值比较PRIMARY KEY或UNIQUE索引的所有部分时,
如:
select * from song_lib where song_id=2
(song_id为表的primary key)
eq_ref:对于每个来自于前面的表的行组合,从该表中用UNIQUE或PRIMARY KEY的索引读取一行,
如:
复制代码 代码如下:select * from song_lib a inner join singer_lib b on _id=_id
(b的type值为eq_ref)
ref:对于每个来自于前面的表的行组合,从该表中用非UNIQUE或PRIMARY KEY的索引读取一行
如:
复制代码 代码如下:select * from song_lib a inner join singer_lib b on _name=_name
和
复制代码 代码如下:select * from singer_lib b where
singer_name=’ccc’(b的type值为ref,因为_name是普通索引)
ref_or_null:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行,
如:
复制代码 代码如下:select * from singer_lib where singer_name=’ccc’ or singer_name is
null
index_merge:该联接类型表示使用了索引合并优化方法
Key: 它显示了MySQL实际使用的索引的名字。如果它为空(或NULL),则MySQL不使用索引。
key_len: 索引中被使用部分的长度,以字节计。
:ref列显示使用哪个列或常数与key一起从表中选择行
: MySQL所认为的它在找到正确的结果之前必须扫描的记录数。显然,这里最理想的数字就是1。
:这里可能出现许多不同的选项,其中大多数将对查询产生负面影响。一般有:
using where:表示使用了where条件
using filesort: 表示使用了文件排序,也就是使用了order by子句,并且没有用到order by
里字段的索引,从而需要额外的排序开销,所以如果出现using filesort就表示排序的效率很低,需要进行优化,比如采用强制索引的方法(force
index)
更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL索引操作技巧汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》、《MySQL数据库锁相关技巧汇总》及《MySQL常用函数大汇总》
希望本文所述对大家MySQL数据库计有所帮助。
四、数据库索引建立不能建在什么地
答:不应该创建索引的的这些列具有下列特点:第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。第三,对于那些定义为text,image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。诚心为你解答,给个好评吧亲,谢谢了
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/104420.html