mysql在控制台如何实现不创建索引直接写代码直接插入100W条数据

mysql在控制台如何实现不创建索引直接写代码直接插入100W条数据,第1张

或者绑定变量,官网例子:

MYSQL_TIME ts

MYSQL_BIND bind[3]

MYSQL_STMT *stmt

strmov(query, "INSERT INTO test_table(date_field, time_field,

timestamp_field) VALUES(?,?,?")

stmt = mysql_stmt_init(mysql)

if (!stmt)

{

fprintf(stderr, " mysql_stmt_init(), out of memory\n")

exit(0)

}

if (mysql_stmt_prepare(mysql, query, strlen(query)))

{

where条件==>order by 条件==>group by 条件 按顺序遵守 最佳左前缀法则

假设创建了复合索引:a,b,c

不在索引列上做任何的 *** 作(计算、函数、显式或隐式的类型转换),否则会导致索引失效而转向全表扫描

1、字符不加单引号会导致索引失效

name字段为varchar类型

这条sql发生了隐式的类型转换:数值==>字符串。所以导致了全表扫描,索引失效

应尽量避免在 where 子句中对字段进行表达式 *** 作,这将导致引擎放弃使用索引而进行全表扫描。如:

mysql中的范围条件有:in/not in、 like、 <>、BETWEEN AND ;

<>后面的索引失效

in会导致索引全部失效!!!

BETWEEN AND 范围条件不会导致索引失效!!!

尽量让索引列和查询列一致;减少select * 的使用

1、查询表结构

2、查询表的索引结构

联合索引:name,age,post;说明add_time字段没有添加索引

3、查看select * 的执行计划

4、查看 select name,age,pos的执行计划

5、如果select只用一部分索引

like以通配符开头(’%abc…’)mysql索引失效会变成全表扫描的 *** 作。

解决:可以使用 覆盖索引 来解决这个问题!

1、先查看表上的索引

id、name、age、pos 四个字段上都有索引; 注意:name是联合索引中的第一个,带头大哥!

2、查看表结构

有个add_time字段没有用到索引

3、查看执行计划

使用UNION ALL

假设创建了联合索引 x(a,b,c)

ps:like虽然也是范围查询但是区别于>、<,%用在最前面就只用到索引a了;%用在最后面可以用到a+b+c!

下面的sql几乎违背了上面的所有原则,索引依然全部生效。因为select是索引覆盖的,select里不包含没有建立索引的字段。因此总是用到索引的。可以看出来索引覆盖在sql优化中的作用性

所有原则都建立在最左匹配原则上,如果多个字段同时匹配,则最左匹配

1、假如表的主键在id1上(有先后顺序),

如果使用id1查询则使用索引,如果使用id2则不使用索引

2、order by 不使用索引

3、group by 使用索引时,字段在第一个字段时 ,使用索引,字段在第二个字段时,不使用索引

4、in查询 *** 作,查询字段在第一个字段时 ,使用索引,查询字段在第二个字段时,不使用索引(not in在表中的查询数量大于30%的时候是全表扫描的,用不到索引。所以没有可以优化的。)

5、like 查询 *** 作,如果第一个字符不是正则符号,则查询字段在第一个字段时 ,使用索引,查询字段在第二个字段时,不使用索引

如果第一个字符是正则符号,则都不使用索引

6、如果没有搜索条件、没有排序条件、没有group by条件时,就不使用索引

7、union 查询 *** 作,哪个字段是第一个索引字段,就在那个查询子句上使用索引


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

原文地址: http://outofmemory.cn/zaji/6230541.html

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

发表评论

登录后才能评论

评论列表(0条)

保存