select () from tb_name where create_time > xxx;
最终得知是因为这个表数据行数已经超过 一千万了,然后create_time字段又没有索引 。
那解决办法肯定是加索引喽。
但是这个表是一直在线上运行,很重要和业务部分。如果给千万级的大表在线加索引 ,肯定会卡死。
然后就搜罗了一大筐解决方案,比如 在线无锁加索引使用
ALTER TABLE tbl_name ADD PRIMARY (column), ALGORITHM=INPLACE, LOCK=NONE;
后来才发现,这个特性是 Mysql 56 以后才支持,然而我们的mysql用的是55版本
最后在 《高性能Mysql》一书中看到,可在通过 “影子拷贝”来解决,
就是 先创建一张和源表无关的新表,然后通过重命名和删表 *** 作交换两张表;
当给新表加完索引后,最上面那条查询直接就是00002s
场景:在给一张有几万条记录的表添加索引时,进度非常慢,导致其它查询无法进行
处理方式:
使用Navicat的命令行模式,执行以下命令:
show processlist;
这时会看到有哪些线程正在执行,也可以查看锁表的线程。你会发现alter table add key 那个线程状态是Waiting for table metadata lock,后面有个这个表的所有 *** 作都是这个状态,很明显是这条加索引的语句把表给锁了。
查看线程ID,执行
kill 线程ID
这样被锁住的表就能立即被使用了。
由此得出一个结论,当一张表数据量很大时,不要轻易添加索引,会导致表被锁死!如果非要添加,那么应该先把数据表进行备份,然后进行空表添加索引。
只能通过ALTER TABLE不能create index
参数说明:
1、一个左连接查询
两个select的type都是ALL
2、在右表book表的card字段上建立索引
3、查看索引情况
4、再次查看执行计划
往左连接的右表上加索引效果非常理想!
5、删除旧索引,在class表上加上新索引。
查询索引情况
6、再次查看执行计划
在left join的左表class添加索引,效果并不理想!
1、接着上面的 *** 作,class表里添加了索引。
查看执行计划
2、将class表和table表调换位置,再次查看执行计划
1、在上面的表结构和基础上,继续创建一个phone表
2、book、phone 两表添加索引
3、查看执行计划
mysql教程:索引的使用以及索引的优缺点
1 索引(index)是帮助MySQL高效获取数据的数据结构。
它对于高性能非常关键,但人们通常会忘记或误解它。
索引在数据越大的时候越重要。规模小、负载轻的数据库即使没有索引,也能有好的性能, 但是当数据增加的时候,性能就会下降很快。
Tip:蠕虫复制,可以快速复制大量的数据
例:insert into emp select from emp;
2 MySQL中常见的索引
◆普通索引 ◆唯一索引 ◆主键索引 ◆组合索引 ◆全文索引◆外键 (只有innodb存储引擎才支持)
21普通索引:
这是最基本的索引,它没有任何限制。有以下几种创建方式:
有以下几种创建方式:
◆创建索引
CREATE INDEX indexName ON tablename(username(length));
◆修改表结构
ALTER tablename ADD INDEX indexName (username(length))
Tip:length可以小于字段实际长度;如果是BLOB 和 TEXT 类型,必须指定length ,下同
◆创建表的时候直接指定
CREATE TABLE mytableuuu( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX indexName (username(length)) );
CREATE TABLE mytable(id INT NOT NULL,username VARCHAR(16) NOT NULL);
create index index1 on mytable(id); //创建普通索引
◆删掉索引:
drop index index1 on mytable;
有一个概念,
行定义:在声明字段(列)的时候定义的,比如primary key
表定义:在所有字段(列)声明完之后定义的,比如primary key,index
CREATE TABLE mytable(id INT NOT NULL,username VARCHAR(16) NOT NULL,index index1(username));
30唯一索引(unique)
索引列的值必须唯一,但允许有空值。
1)创建索引:Create UNIQUE INDEX indexName ON tableName(tableColumns(length))
2)修改表结构:Alter tableName ADD UNIQUE [indexName] ON (tableColumns(length)
3)创建表的时候直接指定:Create TABLE tableName ( [], UNIQUE [indexName](tableColumns(length));
40主键索引(primary key)
1、索引并不是越多越好,要根据查询有针对性的创建,考虑在WHERE和ORDER BY命令上涉及的列建立索引,可根据EXPLAIN来查看是否用了索引还是全表扫描
2、应尽量避免在WHERE子句中对字段进行NULL值判断,否则将导致引擎放弃使用索引而进行全表扫描
3、值分布很稀少的字段不适合建索引,例如”性别”这种只有两三个值的字段
4、字符字段只建前缀索引
5、字符字段最好不要做主键
6、不用外键,由程序保证约束
7、尽量不用UNIQUE,由程序保证约束
8、使用多列索引时主意顺序和查询条件保持一致,同时删除不必要的单列索引
二级索引??
mysql中每个表都有一个聚簇索引(clustered
index
),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引(secondary
indexes)。
以innodb来说,每个innodb表具有一个特殊的索引称为聚集索引。如果您的表上定义有主键,该主键索引是聚集索引。如果你不定义为您的表的主键时,mysql取第一个唯一索引(unique)而且只含非空列(not
null)作为主键,innodb使用它作为聚集索引。如果没有这样的列,innodb就自己产生一个这样的id值,它有六个字节,而且是隐藏的,使其作为聚簇索引。
聚簇索引主要是为了方便存储。。所以二级索引应该都是对聚簇索引的索引。
下面是mysql
manual上的原话,也可能我理解有误。
every
innodb
table
has
a
special
index
called
the
clustered
index
where
the
data
for
the
rows
is
stored
if
you
define
a
primary
key
on
your
table,
the
index
of
the
primary
key
is
the
clustered
index
if
you
do
not
define
a
primary
key
for
your
table,
mysql
picks
the
first
unique
index
that
has
only
not
null
columns
as
the
primary
key
and
innodb
uses
it
as
the
clustered
index
if
there
is
no
such
index
in
the
table,
innodb
internally
generates
a
hidden
clustered
index
on
a
synthetic
column
containing
row
id
values
the
rows
are
ordered
by
the
id
that
innodb
assigns
to
the
rows
in
such
a
table
the
row
id
is
a
6-byte
field
that
increases
monotonically
as
new
rows
are
inserted
thus,
the
rows
ordered
by
the
row
id
are
physically
in
insertion
order
accessing
a
row
through
the
clustered
index
is
fast
because
the
row
data
is
on
the
same
page
where
the
index
search
leads
if
a
table
is
large,
the
clustered
index
architecture
often
saves
a
disk
i/o
operation
when
compared
to
storage
organizations
that
store
row
data
using
a
different
page
from
the
index
record
(for
example,
myisam
uses
one
file
for
data
rows
and
another
for
index
records)
in
innodb,
the
records
in
non-clustered
indexes
(also
called
secondary
indexes)
contain
the
primary
key
value
for
the
row
innodb
uses
this
primary
key
value
to
search
for
the
row
in
the
clustered
index
if
the
primary
key
is
long,
the
secondary
indexes
use
more
space,
so
it
is
advantageous
to
have
a
short
primary
key
图索引和表索引是数据库系统中用来加快数据查询和更新的数据结构。
图索引是一种特殊的索引,它通常用于存储图形数据,例如地图或者三维模型。图索引能够快速找到与给定几何图形相交的图形,或者在图形中找到符合特定条件的点。
表索引是指在数据库表中建立的索引。表索引能够加速数据查询和更新的速度,因为它可以快速找到表中的特定行。表索引通常是基于表中的某个字段或者一组字段建立的。
要创建图索引或表索引,你需要使用数据库管理系统(DBMS)或者数据库开发工具。具体的步骤取决于你使用的数据库类型和开发工具。
例如,在 MySQL 中,你可以使用以下语句来创建一个表索引:
CREATE INDEX index_name ON table_name (column_name);
在这个例子中,index_name 是你要创建的索引的名称,table_name 是你要在其中创建索引的表的名称,column_name 是你要建立索引的字段的名称。
对于图索引,具体的创建方式取决于你使用的数据库类
mysql>use 数据库名;
mysql>show table status;
第一条SQL语句是选择库,这个不用说了。
第二条SQL语句show table status是获得库里面所有表的情况,其中包括了表面,数据数目,数据大小,索引大小
你自己加起来就是整个库的数据大小,和索引大小了。
很简单吧~ 希望能帮助到你。
在PHPMYADMIN里面试试就知道效果了。
如果有不明白,请发消息给我。
以上就是关于Mysql大表加索引全部的内容,包括:Mysql大表加索引、mysql 多表join查询索引优化、如何创建mysql索引以及索引的优缺点等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)