mysql创建索引

mysql 索引

空扰寡人 提交于 2020-01-01 04:22:40
一、索引的种类 1.单列索引:一个索引只包含单个列,但一个表中可以有多个单列索引。 这里不要搞混淆了。   普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。   唯一索引:索引列中的值必须是唯一的,但是允许为空值,   主键索引:是一种特殊的唯一索引,不允许有空值。 2.组合索引:在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。 3.全文索引:全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引。 (5.6.4以后InnoDB也可以使用全文索引) 二、索引的curd 1.索引的创建 ALTER TABLE 适用于表创建完毕之后再添加 ALTER TABLE 表名 ADD 索引类型 (unique,primary key,fulltext,index)[索引名](字段名) ALTER TABLE `table_name` ADD INDEX `index_name` (`column_list`) -- 索引名,可要可不要;如果不要,当前的索引名就是该字段名; ALTER TABLE `table_name` ADD UNIQUE (`column_list`) ALTER TABLE

数据库索引

旧街凉风 提交于 2020-01-01 04:22:24
以下索引知识以mysql索引来阐述 一:MySQL中索引的语法   (1)创建索引 --在创建表的时候添加索引 CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) ); --在创建表以后添加索引 ALTER TABLE my_table ADD [UNIQUE] INDEX index_name(column_name); --或者 CREATE INDEX index_name ON my_table(column_name); 注意: 1、索引需要占用 磁盘空间 ,因此在创建索引时要考虑到磁盘空间是否足够 2、创建索引时需要 对表加锁 ,因此实际操作中需要在业务空闲期间进行    (2)索引相关sql --删除索引 DROP INDEX my_index ON tablename; --或者 ALTER TABLE table_name DROP INDEX index_name; --查看表中的索引 SHOW INDEX FROM tablename --查看查询语句使用索引的情况 //explain 加查询语句 explain SELECT * FROM table_name WHERE column_1='123

二十五、MySQL 索引

时光总嘲笑我的痴心妄想 提交于 2020-01-01 04:21:52
MySQL 索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。 索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。 创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。 实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。 上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。 建立索引会占用磁盘空间的索引文件。 普通索引 创建索引 这是最基本的索引,它没有任何限制。它有以下几种创建方式: CREATE INDEX indexName ON mytable(username(length)); 如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。 修改表结构(添加索引) ALTER table

MySQL联合索引

我们两清 提交于 2020-01-01 02:53:46
1 什么是联合索引 先给出一条查询语句: SELECT * FROM user_info where name = ? and phone = ?; 当需要根据用户姓名和电话确认一条数据时,就可以创建这么一个联合索引,提高查询的效率。 alter table user_info add index name_phone_index (name,phone); 2 为什么要使用联合索引 减少开销: 建一个联合索引(col1,col2,col3),实际相当于建了(col1),(col1,col2),(col1,col2,col3)三个索引。每多一个索引,都会增加写操作的开销和磁盘空间的开销。对于大量数据的表,使用联合索引会大大的减少开销! 覆盖索引: 对联合索引(col1,col2,col3),如果有如下的sql: select col1,col2,col3 from test where col1=1 and col2=2。那么MySQL可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机io操作。减少io操作,特别的随机io其实是dba主要的优化策略。所以,在真正的实际应用中,覆盖索引是主要的提升性能的优化手段之一。 效率高: 索引列越多,通过索引筛选出的数据越少。有1000W条数据的表,有如下sql:select from table where col1=1 and

常用的 19 条 MySQL 优化

自作多情 提交于 2019-12-31 23:55:11
一、EXPLAIN 做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划。 下面来个简单的示例,标注(1,2,3,4,5)我们要重点关注的数据 type列,连接类型。一个好的sql语句至少要达到range级别。杜绝出现all级别 key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引方式 key_len列,索引长度 rows列,扫描行数。该值是个预估值 extra列,详细说明。注意常见的不太友好的值有:Using filesort, Using temporary 二、SQL语句中IN包含的值不应过多 MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select id from table_name where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了;再或者使用连接来替换。 三、SELECT语句务必指明字段名称 SELECT *增加很多不必要的消耗(cpu、io、内存、网络带宽);增加了使用覆盖索引的可能性;当表结构发生改变时,前断也需要更新。所以要求直接在select后面接上字段名。 四、当只需要一条数据的时候,使用limit 1 这是为了使EXPLAIN中type列达到const类型 五

hibernate中dialect的讲解

*爱你&永不变心* 提交于 2019-12-31 07:45:40
RDBMS方言 DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 org.hibernate.dialect.DB2400Dialect DB2 OS390 org.hibernate.dialect.DB2390Dialect PostgreSQL org.hibernate.dialect.PostgreSQLDialect MySQL org.hibernate.dialect.MySQLDialect MySQL with InnoDB org.hibernate.dialect.MySQLInnoDBDialect MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect Oracle (any version) org.hibernate.dialect.OracleDialect Oracle 9i/10g org.hibernate.dialect.Oracle9Dialect Sybase org.hibernate.dialect.SybaseDialect Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect Microsoft SQL Server org.hibernate

当爱情的剧本,多出现一个人【mysql】

倾然丶 夕夏残阳落幕 提交于 2019-12-30 16:12:16
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1、查询sql执行时间和效率 set profiling = 1; 执行下面命令查看系统字段profiling的状态是否为ON,为ON表示开启 show variables; 如图: 然后我们执行sql,查看sql的执行时间以及效率 explain select * from t_user where user_id = 1509; show profiles; 如图: 2、索引 创建索引 ALTER TABLE projectfile ADD UNIQUE INDEX (fileuploadercode); // 唯一索引,不能重复 ALTER TABLE projectfile ADD INDEX (fileuploadercode, projectid); // 普通索引,复合索引 删除索引 drop index fileuploadercode1 on projectfile; 另外一种方式 alter table projectfile drop index s2123; 查看索引 show index from 表名; 3、Sql优化策略 当只需要一条数据的时候,使用limit 1。 3、explain解析字段含义 列名 描述 id 在一个大的查询中每一个查询语句都对应一个id select

神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程(二)

淺唱寂寞╮ 提交于 2019-12-30 09:25:12
开心一刻   一头母牛在吃草,突然一头公牛从远处狂奔而来说:“快跑啊!!楼主来了!”   母牛说:“楼主来了关我屁事啊?”   公牛急忙说:“楼主吹牛逼呀!”   母牛大惊,拔腿就跑,边跑边问:“你是公牛你怕什么啊?”   公牛无奈道:“现在的楼主不仅吹牛逼,还扯蛋!”   然后小牛也在跟着跑,公牛和母牛问:“儿子你跑什么呢?”   小牛说:“楼主还扯犊子啊” 前情回顾    神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程(一) 中,我们讲到了 JOIN 的部分内容,像:驱动表、JOIN 大致流程等。什么,还没看?赶紧去看呀,啊? 你都知道呀,那你走吧   走就走,你把欠的内容还上我就走;我欠什么了? 我欠,我欠... 我好像是欠点东西     1、BKA(Batched Key Access)     2、ON 和 WHERE   请各位坐好,我要开始表演了 环境准备   数据库: MySQL 5.7 . 1   存储引擎: InnoDB   建表和初始化数据 -- 查看版本和存储引擎 SELECT VERSION(); SHOW ENGINES; SHOW VARIABLES LIKE '%storage_engine%'; -- 表创建与数据初始化 DROP TABLE IF EXISTS tbl_user; CREATE TABLE tbl_user (

mysql优化之 EXPLAIN(一)

旧街凉风 提交于 2019-12-30 01:48:23
数据库优化最常用的命令就是用explain查看一下写的sql是否用到了索引: 如: (root@localhost) [akapp]>explain select * from sc_activity where id='3a2cd2a83892d322c1332acdfe'; +----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+ | 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Impossible WHERE noticed after

mysql------explain工具

余生长醉 提交于 2019-12-30 01:46:39
基于mysql5.7,innodb存储引擎 使用explain关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返 回执行计划的信息,而不是执行这条SQL ,如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中 使用到的建表语句文末 explain select * from actor; 在查询中的每个表会输出一行,如果有两个表通过 join 连接查询,那么会输出两行 explain结果字段说明 1. id列 id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的 顺序增长的。 id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行。 2. select_type列 select_type 表示对应行是简单还是复杂的查询。 1)simple:简单查询。查询不包含子查询和union 2)primary:复杂查询中最外层的 select 3)subquery:包含在 select 中的子查询(不在 from 子句中) 4)derived:包含在 from 子句中的子查询。MySQL会将结果存放在一个临时表中,也称为 派生表(derived的英文含义) 5)union:在