Mysql大表加索引

Mysql大表加索引,第1张

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索引以及索引的优缺点等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9711518.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存