LOADING

标签 mysql 下的文章

当使用mysql like %gaga%类似这种索引时 假设索引为普通索引name 需要注意以下几种情况
sql语句为

//右侧百分号匹配 这种情况是可以用到索引的
select name,grade from job where name like "123%";

//双侧百分号匹配 这种情况是不可以用到索引的
select name,grade from job where name like "%123%";

因为本次取like时还需要取name 和 grade 以上这种情况应该设置多列索引 index_name_grade
这样的话索引就可以生效type为index

//多表关联查询
select job.name,job.grade from job left join user on job.level=user.level where job.name like "%123%";

这种情况如果想让索引生效需要把level也加在多列索引里

使用方法,在select语句前加上explain就可以了:

EXPLAIN SELECT surname,first_name form a,b WHERE a.id=b.id
EXPLAIN列的解释:

table:显示这一行的数据是关于哪张表的。

type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、index和ALL。

possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句。

key: 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MySQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MySQL忽略索引。

key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好。

ref:显示索引的哪一列被使用了,如果可能的话,是一个常数。

rows:MySQL认为必须检查的用来返回请求数据的行数。

Extra:关于MySQL如何解析查询的额外信息。

extra列返回的描述的意义:

复制代码
Distinct: 一旦MySQL找到了与行相联合匹配的行,就不再搜索了。

Not exists: MySQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了。

Range checked for each Record(index map:#): 没有找到理想的索引,因此对于从前面表中来的每一个行组合,MySQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一。

Using filesort: 看到这个的时候,查询就需要优化了。MySQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行。

Using index: 列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候。

Using temporary: 看到这个的时候,查询需要优化了。这里,MySQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上。

Where used: 使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题不同连接类型的解释(按照效率高低的顺序排序)。

system: 表只有一行:system表。这是const连接类型的特殊情况。

const: 表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MySQL先读这个值然后把它当做常数来对待。

eq_ref: 在连接中,MySQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用。

ref: 这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好。

range: 这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西时发生的情况。

index: 这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)。

ALL: 这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免。

多个字段的索引 要单独建立一个多个字段的索引。不然的话会从条件字段从左到右去索引中找第一个匹配的索引。like和and语句无法使用索引

新增字段并注释
alter table order_list add channel tinyint(1) NOT NULL COMMENT '0未统计,1小程序,2app,3公众号,4人工';
修改字段默认值
alter table order_list alter column channel set default 0;

添加默认索引
ALTER TABLE table_name ADD INDEX index_name(detail_type,user_id);
注`符号必须有
经过添加索引效率能上升好几倍
实测1w2条数据 三个表添加索引后时间从1.2秒提升到了0.4

以下是其他索引创建方法
1.PRIMARY KEY(主键索引)
mysql>ALTER TABLE table_name ADD PRIMARY KEY ( column )
2.UNIQUE(唯一索引)
mysql>ALTER TABLE table_name ADD UNIQUE (column )
3.INDEX(普通索引)
mysql>ALTER TABLE table_name ADD INDEX index_name ( column )
4.FULLTEXT(全文索引)
mysql>ALTER TABLE table_name ADD FULLTEXT ( column )
5.多列索引
mysql>ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 )

1 创建表的时候写注释
create table test1
(
field_name int comment '字段的注释'
)comment='表的注释';

2 修改表的注释
alter table test1 comment '修改后的表的注释';

3 修改字段的注释
alter table test1 modify column field_name int comment '修改后的字段注释';
--注意:字段名和字段类型照写就行

4 查看表注释的方法
--在生成的SQL语句中看
show create table test1;
--在元数据的表里面看
use information_schema;
select * from TABLES where TABLE_SCHEMA='my_db' and TABLE_NAME='test1' G

5 查看字段注释的方法
--show
show full columns from test1;
--在元数据的表里面看
select * from COLUMNS where TABLE_SCHEMA='my_db' and TABLE_NAME='test1' G

备份数据库
/下
mysqldump -uroot -pPassword [database name] > [dump file]
导入数据库
mysql 下
source fileName.sql
更改导入大小
max_allowed_packet = 1024M
下载文件
sz